這道題算是股票問題的變體之一,主要在於不限制交易次數而存在冷凍期,所以我們需要對我們的dp陣列進行改變,第一維是指第幾天,第二維是指是否持有股票,在這裡因為不限制交易次數k,所以並未涉及第三維度。

同時,在這裡我的狀態轉移方程為:

第i天未持有股票的可能性有:1.第i-1天未持有股票 2.第i-1天持有股票後賣出了。

  1. dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i-1]);

第i天持有股票的可能性有:1.第i-1天持有股票 2.第i-1天未持有股票,且非冷凍期買入。此時第二種情況為dp[i-2][0]-prices[i-1],原因在於:由上一個方程可知,dp[i-1][0]=Math.max(dp[i-2][0],dp[i-2][1]+prices[i-2]);我們需要的是非冷凍期的買入,所以取dp[i-2][0].

不妨設想,冷凍期如果不是兩天,而是k天,我們也可以直接取為dp[i-k][0];

  1. dp[i][1]=Math.max(dp[i-1][1],dp[i-2][0]-prices[i-1]);
  1. public int maxProfit(int[] prices) {
  2.  
  3. int [][] dp=new int[prices.length+1][3];
  4.  
  5. dp[0][0]=dp[1][0]=0;
  6. dp[0][1]=Integer.MIN_VALUE;
  7. dp[1][1]=-prices[0];
  8. for(int i=2;i<=prices.length;i++)
  9. {
  10. dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i-1]);
  11. dp[i][1]=Math.max(dp[i-1][1],dp[i-2][0]-prices[i-1]);
  12. }
  13.  
  14. return dp[prices.length][0];
  15. }