题目链接: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