还是采取动态规划的思路:令dp[i]代表在第I天卖出所能得到的最大收益...
dp[i]有三个子状态:
(1) 之前没有任何购买行为:则dp[i]=0;
(2) 上一次购买不是前一天(I-1): 则dp[i]=dp[i-1]+prices[i]-prices[i-1](相当于前一天卖出的最大收益+两天的差价);
(3) 上一次购买是前一天:则dp[i]=prices[i]-prices[i-1]+(i-3)天之前的最大收益(i-2用来cooldown).
求最大值即可...
public class Solution {
public int maxProfit(int[] prices) {
int days=prices.length;
if( days<2 )
{
return 0;
}
if( days==2 )
{
return Math.max(0,prices[1]-prices[0]);
}
int[] maxProfit=new int[days];
maxProfit[0]=0;
// maxProfit[1]=Math.max(0,prices[1]-prices[0]);
// maxProfit[2]=Math.max(Math.max(0,prices[1]-prices[0]),Math.max(prices[2]-prices[0],prices[2]-prices[1]));
maxProfit[1]=prices[1]-prices[0];
maxProfit[2]=Math.max(prices[2]-prices[0],prices[2]-prices[1]);
for( int i=3;i<days;i++ )
{
int tmpMax=maxProfit[0];
for( int j=1;j<=i-3;j++ )
{
if( maxProfit[j]>tmpMax )
{
tmpMax=maxProfit[j];
}
}
maxProfit[i]=Math.max(0,Math.max( maxProfit[i-1]+prices[i]-prices[i-1],tmpMax+prices[i]-prices[i-1]));
//maxProfit[i]=Math.max(Math.max(0, maxProfit[i-1]),Math.max(maxProfit[i-3]+prices[i]-prices[i-1], maxProfit[i-2]));
}
int res=maxProfit[0];
for( int i=1;i<days;i++ )
{
if( maxProfit[i]>res )
{
res=maxProfit[i];
}
}
return res;
}
}