packagecode;/* * 188. Best Time to Buy and Sell Stock IV * 题意:买卖股票最大利润,可以买卖k次 * 难度:Hard * 分类:Dynamic Programming * 思路:二维dp, dp[i][j] 表示i次交易,在数组prices[0~j]上的最大利润 * dp[i][j] = Max( dp[i][j-1], dp[i-1][jj]+prices[j]-prices[jj] ) { jj in range of [0, j-1] } * = Max( dp[i][j-1], prices[j]+ max(dp[i-1][jj]-prices[jj]) ) 转化为这一步,少了一层循环 * dp[0][j] = 0; dp[i][0] = 0; * Tips:lc121, lc309, lc188, lc123, lc714 */publicclasslc188{publicintmaxProfit(intk,int[]prices){if(prices.length==0)return0;intn=prices.length;//if k >= n/2, then you can make maximum number of transactions.if(k>=n/2){intmaxPro=0;for(inti=1;i<n;i++){if(prices[i]>prices[i-1])maxPro+=prices[i]-prices[i-1];}returnmaxPro;}int[][]dp=newint[k+1][prices.length];for(inti=1;i<=k;i++){intlocalMax=-prices[0];for(intj=1;j<prices.length;j++){//jj的计算和这一维合并,总的复杂度是二次方而不是三次dp[i][j]=Math.max(dp[i][j-1],prices[j]+localMax);localMax=Math.max(localMax,dp[i-1][j]-prices[j]);}}returndp[k][prices.length-1];}}