leetcode 309.买卖股票的最佳时机含冷冻期

思路:DP状态机

所谓的DP状态机,其实就是标定这个题目中的所有状态,然后进行转移而已。

这的状态有三个:

1.有票的时候;

2.没有票且处于冷冻期的时候;

3.没有票但不处于冷冻期的时候;

dp数组就用来表示在第i天的时候的最大利润。

我们开始分析,在还没开始股票的价格跌宕时,我们在第0天如果买了股票,那么我们这个时候的收益肯定是负的,也就是当前价格的-price[i]。因为并没有因为股票而赚钱,并且还买了股票。其他的时候利润都是0,这是初始值。

假设我们从第一天开始,我们在第一天的时候如果是状态1,那么这个dp的最大利润就是:max(我在第0天的时候就买了股票的最大利润,我第0天没有票且不处于冷冻期并且在当天买了股票)

如果是状态2,只有一种可能,那就是我在第0天的时候有的股票,在当天卖出去了,也就是:

dp[i-1][0]+prices[i]。

如果是状态3,那么就是:max(我在第0天的时候卖出去了票子(在我有票的情况下)即第0天的状态2,我有票但是没卖即第0天的状态3)

一直这样类推就行了。

注意:最后我们需要考虑最后一天,最后一天如果说我们是又买了股票,那根本就没有收益,没有意义;所以我我们需要比较的只有后面那两种状态哪个利润最大。

上代码:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n=prices.size();
        vector<vector<int>>dp(n+1,vector<int>(3));
        dp[0][0]=-prices[0];//持有票的时候
        dp[0][1]=0;//没有票并且处于冷冻期
        dp[0][2]=0;//没有票并且不处于冷冻期
        for(int i=1;i<n;i++){
            dp[i][0]=max(dp[i-1][0],dp[i-1][2]-prices[i]);
            dp[i][1]=dp[i-1][0]+prices[i];
            dp[i][2]=max(dp[i-1][1],dp[i-1][2]);
        }
        return max(dp[n-1][1],dp[n-1][2]);
    }
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值