Leetcode 309 - Best Time to Buy and Sell Stock with Cooldown(dp)

本文介绍了一种在考虑 cooldown 的情况下实现股票买卖策略的方法。通过动态规划的方式,定义了两个状态来表示持有股票和不持有股票的情况,并给出了具体的转移方程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意

给定一个数组,其中ai代表第i天股票的价格为ai。你可以进行多次买卖,但是手中最多同时持有1支股票,并且某天卖出股票后,在那之后的一天不能进行任何买卖(cooldown)。
求能获得的最大利润。

思路

状态表示d[i,j]代表第i天是否持股。j=1代表持股,j=0代表不持股。
状态转移
1. 如果第i天不持股股票:可能是前一天就没有股票;或者前一天持股,在第i天卖掉了。
2. 如果第i天持股:可能是前一天也持股;或者前两天不持股(cooldown),第i天买入一支股票。
转移方程
d[i,0]=max{d[i1,0],d[i1,1]+a[i]}
d[i,1]=max{d[i1,1],d[i2][0]a[i]}

细节

注意当i不超过第2天的时候持股的转移。

代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<vector<int>> d(prices.size(), vector<int>(2, 0));
        if (prices.size()) {
            d[0][0] = 0, d[0][1] = -prices[0];
            for (int i = 1; i < prices.size(); i++) {
                d[i][0] = max(d[i - 1][1] + prices[i], d[i - 1][0]);
                d[i][1] = max(d[i - 1][1], (i >= 2 ? d[i - 2][0] : 0) - prices[i]);
            }
            return d[prices.size() - 1][0];
        }
        return 0;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值