动态规划dp —— 15.最佳买卖股票时机含冷冻期

示例1:

 

 1.状态表示

是什么?dp表中里的值所表示的含义就是状态表示

对于股票有三种子状态,所以把dp[i]划分三种情况:1.买入 2.可交易 3.冷冻期

所以开一个n * 3的dp表

dp[i][0]表示:第i天结束之后,处于“买入”状态,此时的最大利润

dp[i][1]表示:第i天结束之后,处于“可交易”状态,此时的最大利润

dp[i][2]表示:第i天结束之后,处于“冷冻期”状态,此时的最大利润

2.状态转移方程

dp[i] 等于什么

 dp[i][0] = max(dp[i-1][0] , dp[i-1][1] - p[i])

dp[i][1] = max(dp[i-1][1] , dp[i-1][2])

dp[i][2] = dp[i-1][0] + p[i]

3.初始化

保证填表的时候不越界

因为要用到i-1所以要初始化第一个位置

dp[0][0] = 0 - p[0]

dp[0][1] = 0

dp[0][2] = 0

4.填表顺序

为了填写当前状态的时候,所需要的状态已经计算过了

从左往右填,一次填三个表

5.返回值

题目要求+状态表示

max(dp[n-1][1] , dp[n-1][2] , dp[n-1][0])

6.代码

class Solution {
public:
    int maxProfit(vector<int>& p) {
        int n = p.size();
        //1.创建dp表
        vector<vector<int>> dp(n,vector<int>(3));
        //2.初始化
        dp[0][0] = 0 - p[0];
        //3.填表
        for(int i = 1; i < n;i++)
        {
            dp[i][0] = max(dp[i-1][0] , dp[i-1][1] - p[i]);
            dp[i][1] = max(dp[i-1][1] , dp[i-1][2]);
            dp[i][2] = dp[i-1][0] + p[i];
        }
        //4.返回值
        return max(dp[n-1][0],max(dp[n-1][1],dp[n-1][2]));
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值