Bootstrap

LeetCode121:买卖股票的最佳时机

题目链接:121. 买卖股票的最佳时机 - 力扣(LeetCode)

代码如下

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        //dp[i][0]是持有股份的最大现金, dp[i][1]是不持有股份的最大现金
        if(prices.size() == 0)  return 0;
        vector<vector<int> > dp(prices.size() + 1, vector<int>(2));
        dp[0][0] = dp[0][0] - prices[0];
        dp[0][1] = 0;
        for(int i = 1; i < prices.size(); i++)
        {
            dp[i][0] = max(dp[i - 1][0], - prices[i]);
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
        }
        return dp[prices.size() - 1][1];
    }
};

这个题目难度确实不小,可以作为一个经典的题目

这个题目很明显的就是分为持有股票和不持有股票的最大现金,所以我们用一维dp数组还是实现不出来的,所以我们需要用到二维数组,用0和1来表示持有和不持有的状态

首先确定好dp的含义//dp[i][0]是持有股份的最大现金, dp[i][1]是不持有股份的最大现金

其次是递推公式,这个dp[i][0] = max(dp[i - 1][0], - prices[i]);,dp[i - 1][0]也是我i - 1的天数不持有股票的最大现金,要是我当i天持有了股票,那我就要减去price[i]

这个递推公式dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);,因为dp[i - 1][1]也就是我不持有股票现金,然后去和我之前持有股金并且我卖了,去取一个最大值。

初始化:这个dp[0][0] = dp[0][0] - prices[0];也就是我当前持有股票,要减去price[0]

                 dp[0][1] = 0;这个是因为我已经卖出去了,我手中现金一定是大于等于0的,所以我们初始化为0

;