一、leetcode第121题
本题要求买卖股票一次获取最大利润,设置dp数组,其中dp[i][0]的含义是第i天持有股票的最大利润,dp[i][1]的含义是第i天不持有股票的最大利润,可得递推公式为dp[i][0]=max(dp[i-1][0],-prices[i]),dp[i][1]=max(dp[i-1][0]+prices[i],dp[i-1][1])。最后返回dp[i][1],即在最后一天不持有股票的最大值。
具体代码如下:
class Solution {
public:int maxProfit(vector<int>& prices) {vector<vector<int>>dp(prices.size(),vector<int>(2));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][0]+prices[i],dp[i-1][1]);}return dp[prices.size()-1][1];}
};
二、leetcode第122题
本题与上题的区别在于可以多次买卖股票,因此只有递推公式有所不同,变化如下: dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]);也就是此处要考虑前一天不持有股票的情况,因为在此之前可能进行股票的买卖。
具体代码如下:
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 dp[prices.size()-1][1];}
};