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

66 篇文章 0 订阅

题意

给定一个数组,其中 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、付费专栏及课程。

余额充值