1. 买卖股票的最佳时机含冷冻期
题目链接:

2. 题目解析

3. 算法原理
状态表示:以某一个位置为结尾或者以某一个位置为起点
dpi0表示:第i天结束之后,处于买入状态,此时的最大利润
dpi1表示:第i天结束之后,处于可交易状态,此时的最大利润
dpi2表示:第i天结束之后,处于冷冻期状态,此时的最大利润
2. 状态转移方程在第i-1天处于买入状态,看买入状态能不能到自己,看可交易状态能不能到买入状态,看冷冻期状态能不能到买入状态,其他两个状态也是如此,一共9种状态
|----------------|----------------------------|-----------------------|----------------|
| | 买入状态到 | 可交易状态到 | 冷冻期状态到 |
| 买入状态 0 | 什么都不干(yes) | -pricesi(买股票) | 不能 |
| 可交易状态1 | 不能 | 什么都不干(yes) | 什么都不干(yes) |
| 冷冻期状态2 | +prices i(卖股票) | 不能 | 不能 |根据最近的一步来划分问题:
1. dpi0=max(dpi-10 , dpi-11 - pricesi)
2. dpi1=max(dpi-11 , dpi-12 )
3. dpi2=dpi-10+prices i
3. 初始化 :把dp表填满不越界,让后面的填表可以顺利进行要想处于买入状态就需要进行买入: dp00= -prices0
dp01=0 dp02=0
4. 填表顺序本题的填表顺序是:从左往右,三个表同时填(因为填写其中一个表需要用到其他两个表)
5. 返回值 :题目要求 + 状态表示因为是要最大利润,所以买入状态不用考虑
本题的返回值是:max(dpn-11,dpn-12)
4. 代码
动态规划的固定四步骤:1. 创建一个dp表
2. 在填表之前初始化
3. 填表(填表方法:状态转移方程)
4. 确定返回值
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
//1. 创建一个规模(n+1*3)的dp表
vector<vector<int>>dp(n, vector<int>(3));
//2. 在填表之前初始化
dp[0][0]=-prices[0];
//3. 填表(填表方法:状态转移方程)
for(int i=1;i<n;i++)
{
dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]);
dp[i][1]=max(dp[i-1][1],dp[i-1][2]);
dp[i][2]=dp[i-1][0]+prices[i];
}
//4. 确定返回值
return max(dp[n-1][1],dp[n-1][2]);
}
};
未完待续~

