Leetcode - Best Time to Buy and Sell Stock with Cooldown

My code:

public class Solution {
    public int maxProfit(int[] prices) {
        if (prices == null || prices.length <= 1) {
            return 0;
        }
        
        int n = prices.length;
        int[] s0 = new int[n];
        int[] s1 = new int[n];
        int[] s2 = new int[n];
        
        s0[0] = 0;
        s1[0] = -prices[0];
        s2[0] = Integer.MIN_VALUE;
        
        for (int i = 1; i < n; i++) {
            s0[i] = Math.max(s0[i - 1], s2[i - 1]);
            s1[i] = Math.max(s0[i - 1] - prices[i], s1[i - 1]);
            s2[i] = s1[i - 1] + prices[i];
        }
        
        return Math.max(s0[n - 1], Math.max(s1[n - 1], s2[n - 1]));
    }
}

reference:
https://discuss.leetcode.com/topic/30680/share-my-dp-solution-by-state-machine-thinking/2

这道题目看了解释后才做出来。我觉得上面的解释说的很好。
这是一种新的DP类型。通过画 状态机来解决问题。
状态机画出来后,问题也就解决了。
只需要处理一些 corner case。
这道题目很像那个 robber 的题。他也是不能连续的偷。但是他是累加,这个有个买卖的先后关系,所以更难。
那道题目就两个状态。

s0 s1

s0 --> rest s0
s0 --> steal s1

s1 --> rest s0

s0[i] = max(s0[i - 1], s1[i - 1]);
s1[i] = s0[i - 1] + money[i];

My code:

public class Solution {
    public int rob(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        else if (nums.length == 1) {
            return nums[0];
        }
        
        int n = nums.length;
        int[] s0 = new int[n + 1];
        int[] s1 = new int[n + 1];
        s0[0] = 0;
        s1[0] = 0;
        for (int i = 1; i <= n; i++) {
            s0[i] = Math.max(s0[i - 1], s1[i - 1]);
            s1[i] = s0[i - 1] + nums[i - 1];
        }
        
        return Math.max(s0[n], s1[n]);
    }
}

Anyway, Good luck, Richardo! -- 08/26/2016

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容