leetcode: Best Time to Buy and Sell Stock with Cooldown

还是采取动态规划的思路:令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;
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值