LeetCode121. 买卖股票的最佳时机
动规五部曲:
1、dp[i][0]:在第i天持有股票的最大收入;dp[i][1]:在第i天不持有股票的最大收入。
2、递推公式:第i天持有股票,有两种情况:前一天已经持有,当天刚买入,取最大值;第i天不持有股票,也有两种情况:前一天也未持有,当天刚卖出,取最大值。
3、初始化
4、遍历顺序
5、打印dp数组
代码如下:
class Solution {
public:int maxProfit(vector<int>& prices) {vector<vector<int>> dp(prices.size(),vector<int>(2,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 max(dp[prices.size()-1][0],dp[prices.size()-1][1]);}
};
LeetCode122.买卖股票的最佳时机II
与上一题唯一的区别就是,股票可以买卖多次,因此代码上的唯一区别就是第i天持有股票时,如果是当天买入的,应该用持续的收益-price[i],而如果当天买入股票时,持续的最大收益就是price[i-1][1]。
代码如下:
class Solution {
public:int maxProfit(vector<int>& prices) {vector<vector<int>> dp(prices.size(),vector<int>(2,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],dp[i-1][1]-prices[i]);//区别dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i]);}return max(dp[prices.size()-1][0],dp[prices.size()-1][1]);}
};