這道題算是股票問題的變體之一,主要在於不限制交易次數而存在冷凍期,所以我們需要對我們的dp陣列進行改變,第一維是指第幾天,第二維是指是否持有股票,在這裡因為不限制交易次數k,所以並未涉及第三維度。
同時,在這裡我的狀態轉移方程為:
第i天未持有股票的可能性有:1.第i-1天未持有股票 2.第i-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];
- dp[i][1]=Math.max(dp[i-1][1],dp[i-2][0]-prices[i-1]);
- public int maxProfit(int[] prices) {
- int [][] dp=new int[prices.length+1][3];
- dp[0][0]=dp[1][0]=0;
- dp[0][1]=Integer.MIN_VALUE;
- dp[1][1]=-prices[0];
- for(int i=2;i<=prices.length;i++)
- {
- dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i-1]);
- dp[i][1]=Math.max(dp[i-1][1],dp[i-2][0]-prices[i-1]);
- }
- return dp[prices.length][0];
- }