1. 关于动规-股票
核心是分状态问题
分成两种状态持有[0]和不持有[1],再拆分两种子情况比max:
- 在第i天持有 dp[i][0]
- 在第i天买入 =dp[i-1][1]-prices[i]
- 在以前买入 =dp[i-1][0]
- 在第i天不持有 dp[i][1]
- 在第i天卖出 =dp[i-1][0]+prices[i]
- 在以前卖出 =dp[i-1][1]
股票问题分情况
- 情况1 单次买卖:
- 只考虑保存单个的dp[i][0]和dp[i][1]
- dp[i][0]=Math.max(dp[i-1][0],-prices[i]);
- dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);
- 然后比max
- 情况2.1 多次买卖-无限次
- 储存累积的dp[i][0]和dp[i][1]
- dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]-prices[i]);
- dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);
- 然后比max
- 情况2.2 多次买卖-限次数
- 状态除了持有/不持有外,增加状态[次数k]为[j],并嵌套遍历到i时,其次数为j的情况for(int i=1;i<prices.length;i++){ for(int j=1;j<=k;j++){…
- dp[i][j][0]=Math.max(dp[i-1][j-1][1]-prices[i],dp[i-1][j][0]);
- dp[i][j][1]=Math.max(dp[i-1][j][0]+prices[i],dp[i-1][j][1]);
- 情况2.3 多次买卖-无限次-含冷冻期
- 依据冷冻期天数(如卖出冷冻1天),倒推其需要的初始化数据,此处需要设定i=0和i=1
- 初始化:此处注意第2天开始,就要考虑4种情况了
- 第1天:dp[0][0]=-prices[0]; dp[0][1]=0;
- 第2天:dp[1][0]=Math.max(dp[0][0],-prices[1]); dp[1][1]=Math.max(dp[0][0] + prices[1], dp[0][1]);
- 递推:
- dp[i][0]=Math.max(dp[i-2][1]-prices[i],dp[i-1][0]);
- dp[i][1]=Math.max(dp[i-1][0]+prices[i],dp[i-1][1]);