public class Solution {
public int maxProfit(int k, int[] prices) {
if(k==0||prices.length==0)
{
return 0;
}
int len = prices.length;
if( k>=len )
{
return fun(prices);
}
int[] local = new int[k+1];
int[] ret = new int[k+1];
for(int i=1;i<len;i++)
{
int dif = prices[i]-prices[i-1];
for(int j=k;j>=1;j--)
{
local[j] = Math.max(local[j]+dif,ret[j-1]+Math.max(0,dif));
ret[j] = Math.max(ret[j],local[j]);
}
}
return ret[k];
}
int fun(int[] prices)
{
int len = prices.length;
int ret=0;
for(int i=1;i<len;i++)
{
int dif = prices[i]-prices[i-1];
if( dif>0 )
{
ret += dif;
}
}
return ret;
}
}
和之前题目的区别在于限制了交易次数为k...
同样采取动态规划的方法,借鉴了网上的思路....
两个数组local和ret分别记录经过i次交易后全局和局部的最优解...实际上在新的一天用户有两种选择:
1. 完成一次交易局部最优local[i] = (ret[i-1]+dif)
2.保持观望 local[i] += dif
那么遍历每一天动态的更新这两个数组,即可得到结果