示例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]));
}
};