题目来源 leetcode 309
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/
思路
考虑问题所需要的变量:1.首先是给的条件的数量,即天数
2.当天可能的情况:是否持有股票,假如没有拿股票是否在冷冻区
所以需要开一个二维数组,每一个值得意义是在当前条件和情况下所可以得到的最大利润。
因为最开始的股票一定要买,且不存在股票不持有的情况,所以在第0天的时候
1.情况为-price[j] ,即花了price[j]快钱
其他为0;
即
{
dp[0] [0] = -prices[0]
dp[1] [0] = dp [2] [0] = 0
}
接着我们分开讨论
dp[day] [0] : 第一种情况 昨天有股票
dp[day] [1] : 第二种情况 昨天没有股票且在冷冻区
dp [day] [2] : 第三种情况 昨天没有股票且不在冷冻区
情况一:
假如当天持有股票:那么要么是昨天也持有股票,要么是昨天没有股票且不在冷冻区
所以转移方程分别为
dp[day] [0] = dp[day - 1] [0]
dp[day] [0] = dp[day - 1] [2] - prices[day] //昨天没有今天买要支付当天的股票钱
所以合并之后是:
dp[day] [0] = max{dp[day - 1] [0] , max[day - 1] [2] - prices[day]}
情况二:
昨天没有股票且在冷冻区
那必然昨天是有股票的,而且今天卖出了
所以:
dp[day] [2] = dp[day - 1] [1] + prices[day]
情况三:
昨天没有股票且不在冷冻区
那么昨天可能在冷冻区,也可能是情况三;
所以
dp[day] [3] = max{dp[day - 1] [3] , max[day - 1] [2]}
代码如下:
int maxProfit(int* prices, int pricesSize){
int dp[pricesSize + 1][3];
dp[0][0] = -prices[0];
dp[0][1] = dp[0][2] = 0;
for(int day = 1 ; day < pricesSize + 1 ; day ++){
for(int situa = 0 ; situa < 3 ; situa ++){
if(situa == 0){
int one = dp[day - 1][0];
int two = dp[day - 1][2] - prices[day - 1];
dp[day][situa] = one > two ? one : two;
}else if(situa == 1){
dp[day][situa] = dp[day - 1][0] + prices[day - 1];
}else{
int one = dp[day - 1][1];
int two = dp[day - 1][2];
dp[day][situa] = one > two ? one : two;
}
}
}
int ans = dp[pricesSize][1] > dp[pricesSize][2] ? dp[pricesSize][1] : dp[pricesSize][2];
return ans;
}