1. 程式人生 > >動態規劃——Best Time to Buy and Sell Stock IV

動態規劃——Best Time to Buy and Sell Stock IV

這是這個系列題目的第四個,題目大意和之前的差不多,但是這次提供最多k次的操作,操作還是不能同時操作即必須結束前一個操作才能進行後一個操作。 狀態比較好理解,就是題目要求的縮小版,dp[k][i]表示進行到第i天時最多k次操作能得到的最大利益,但是要注意最後一次操作不一定時第i天完成的。
狀態轉移方程:dp[k][i] = max(dp[k][i-1],dp[k-1][j]+prices[i]-prices[j]) (0<=j<=i)
比如現在正在考慮dp[k][i],選擇有兩種,一是第i天不操作,二是在第k-1次第j天后進行第k次操作。這個題的狀態轉移方程相對來說還是比較容易理解的。 當然如果給的運算元比總天數的一半還要多的話,相鄰兩天一次交易即可,當然要保證後一天的價格比前一天的價格要高。這種情況就不用再動態的遞推了,直接累加即可。
 1 class Solution{
 2     public static int maxProfit(int
k,int[] prices) { 3 int nlen = prices.length; 4 if(nlen<=1)return 0; 5 else if(k>nlen/2) { 6 int res = 0; 7 for(int i = 1;i<nlen;i++) 8 if(prices[i]>prices[i-1])res+=(prices[i]-prices[i-1]); 9 return res;
10 }else { 11 int temp = 0; 12 int[][]dp = new int[k+1][nlen]; 13 Arrays.fill(dp[0],0); 14 for(int i = 0;i<=k;i++) 15 dp[i][0] = 0; 16 for(int kt = 1;kt<=k;kt++) { 17 for(int i = 1;i<nlen;i++) {
18 temp = 0; 19 for(int j = 0;j<=i;j++) 20 temp = temp>(dp[kt-1][j]+prices[i]-prices[j])?temp:(dp[kt-1][j]+prices[i]-prices[j]); 21 dp[kt][i] = dp[kt][i-1]>temp?dp[kt][i-1]:temp; 22 } 23 } 24 return dp[k][nlen-1]; 25 } 26 } 27 }

不過在最後說一句,由於我編寫的程式碼使用了三層for迴圈,時間複雜度為O(n^3),在LeetCode上僅僅擊敗了不到9%的人,額,又是一個比較慘淡的資料了。。。。