309. 最佳买卖股票时机含冷冻期

image.png

代码

  1. class Solution {
  2. public int maxProfit(int[] p) {
  3. /**
  4. * 1.确定dp数组以及下标含义
  5. * dp[i][j],第i天状态为j,所生的最多现金为dp[i][j]
  6. * j -> 0 状态一:买入股票状态(今天买入股票,或者是之前就买入了股票然后没有操作)
  7. * 卖出股票状态
  8. * 1) j -> 1 状态二: 两天前就卖出了股票,度过了冷却期,一直没操作,今天保持卖出股票状态
  9. * 2) j -> 2 状态三: 今天就卖出了股票
  10. * j -> 3 状态四: 今天为冷却器,但冷却状态不可持续。只有一天!
  11. */
  12. if( p == null || p.length < 2) return 0;
  13. int size = p.length;
  14. int [][] dp = new int [size][4];
  15. dp[0][0] = -p[0]; //持有股票
  16. for(int i = 1; i < size; i++ ) {
  17. dp[i][0] = Math.max(dp[i - 1][0],Math.max(dp[i - 1][1], dp[i - 1][3]) - p[i]);
  18. dp[i][1] = Math.max(dp[i - 1][3],dp[i - 1][1]);
  19. dp[i][2] = dp[i - 1][0] + p[i];
  20. dp[i][3] = dp[i - 1][2];
  21. }
  22. return Math.max(Math.max(dp[size - 1][1],dp[size - 1][2]), dp[size -1][3]);
  23. }
  24. }