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

动态规划dp —— 15.最佳买卖股票时机含冷冻期_第1张图片

示例1:

动态规划dp —— 15.最佳买卖股票时机含冷冻期_第2张图片

 

 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 —— 15.最佳买卖股票时机含冷冻期_第3张图片

 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& p) {
        int n = p.size();
        //1.创建dp表
        vector> dp(n,vector(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]));
    }
};

你可能感兴趣的:(动态规划,动态规划,算法)