leetcode 309. Best Time to Buy and Sell Stock with Cooldown 解题报告

原题链接

原题链接

解题思路

第一感觉就是动态规划,但是还是难以将抽象的题目具体化,如何根据前面的状态推断现在这个状态(状态转移方程)。
根据题意可以明了,总共有三个状态,持有股票,卖掉股票,休息一天,后两种都可以归纳为未持有股票。状态有了,如何推断?
再往下分析,未持有股票的状态,最大利润有两种可能。一,和昨天一样保持未持有;二,昨天持有股票今天卖掉。

sdp[i] = Math.max(sdp[i-1],bdp[i-1] + prices[i]);

持有股票的状态,最大利润也有两种可能。一,和昨天一样持有股票不卖;二,两天前未持有(休息一天)今天购买。

bdp[i] = Math.max(bdp[i-1],sdp[i-2] - prices[i]);

根据以上分析,状态转移方程就有了。代码也就简单了(如下所示)。

解题代码

public class Solution {
     
    public int maxProfit(int[] prices) {
        if (prices == null || prices.length == 0) {
            return 0;
        }
        int[] sdp = new int[prices.length];
        int[] bdp = new int[prices.length];
        sdp[0] = 0;
        bdp[0] = -prices[0];
        for (int i = 1;i < prices.length ;i++ ) {
            sdp[i] = Math.max(sdp[i-1],bdp[i-1] + prices[i]);
            if(i >= 2) {
                bdp[i] = Math.max(bdp[i-1],sdp[i-2] - prices[i]);
            } else {
                bdp[i] = Math.max(bdp[i-1],-prices[i]);
            } 
        }
        return sdp[prices.length - 1];
    }
}

你可能感兴趣的:(leetcode,动态规划,leetcode)