121. 买卖股票的最佳时机(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台)
思路:定义一个二维dp数组,第二维长度为2,用来记录到每个节点时,持有股票或不持有股票情况下手里的现金。
int maxProfit(vector<int>& prices) {
int size = prices.size();
if(size==1) return 0;
vector<vector<int>> dp(size, vector<int>(2, 0));
dp[0][0] = -prices[0];
dp[0][1] = 0;
for(int i=1; i<size; i++){
dp[i][0] = max(dp[i-1][0], -prices[i]);
dp[i][1] = max(dp[i-1][1], prices[i]+dp[i-1][0]);
}
return dp[size-1][1];
}
122. 买卖股票的最佳时机 II(题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台)
思路:和上题类似,区别在于股票可以买卖多次,因此计算某个节点持有股票或者不持有股票时都要把本节点和以往结果做比较。例如对dp[i][0]进行赋值时,就要考虑是保持以往的持有数据好,还是在以往不持有股票的情况下购买此次的股票好。
int maxProfit(vector<int>& prices) {
int size = prices.size();
if(size==1) return 0;
vector<vector<int>> dp(size, vector<int>(2, 0));
dp[0][0] = -prices[0];
dp[0][1] = 0;
for(int i=1; i<size; i++){
dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices[i]);
dp[i][1] = max(dp[i-1][0]+prices[i], dp[i-1][1]);
}
return dp[size-1][1];
}