动态规划例题(三)

题目来源 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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yyym__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值