码迷,mamicode.com
首页 > 其他好文 > 详细

309. Best Time to Buy and Sell Stock with Cooldown

时间:2016-07-05 00:59:31      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:

    /*
     * 309. Best Time to Buy and Sell Stock with Cooldown 
     * 2016-7-4 by Mingyang
     * http://buttercola.blogspot.com/2016/01/leetcode-best-time-to-buy-and-sell.html
     * 
     *1. Define States
     *
     *To represent the decision at index i:
     *buy[i]: Max profit till index i. The series of transaction is ending with a buy.
     *sell[i]: Max profit till index i. The series of transaction is ending with a sell.
     *To clarify:
     *Till index i, the buy / sell action must happen and must be the last action.
     * It may not happen at index i. It may happen at i - 1, i - 2, ... 0.
     *In the end n - 1, return sell[n - 1]. Apparently we cannot finally end up with a buy. 
     *In that case, we would rather take a rest at n - 1.
     *For special case no transaction at all, classify it as sell[i], so that in the end, we can still return sell[n - 1]. 
     *
     *2. Define Recursion
     *
     *buy[i]: To make a decision whether to buy at i, we either take a rest, by just using the old decision at i - 1, 
     *or sell at/before i - 2, then buy at i, We cannot sell at i - 1, then buy at i, because of cooldown.
     *sell[i]: To make a decision whether to sell at i, we either take a rest, by just using the old decision at i - 1, 
     *or buy at/before i - 1, then sell at i.
     *So we get the following formula:
     *buy[i] = Math.max(buy[i - 1], sell[i - 2] - prices[i]);   
     *sell[i] = Math.max(sell[i - 1], buy[i - 1] + prices[i]);
     */
     public int maxProfit5(int[] prices) {
            if (prices == null || prices.length <= 1) {
                return 0;
            }
            int[] sell=new int[prices.length];
            int[] buy=new int[prices.length];
            buy[0] = -prices[0];
            sell[0] = 0;
            buy[1]=Math.max(buy[0],-prices[1]);
            sell[1]=Math.max(sell[0],buy[0]+prices[1]);
            for (int i = 2; i <prices.length; i++) {
                 buy[i]=Math.max(buy[i-1],sell[i-2]-prices[i]);
                 sell[i]=Math.max(sell[i-1],buy[i-1]+prices[i]);
            }
            return sell[prices.length-1];
        }

 

309. Best Time to Buy and Sell Stock with Cooldown

标签:

原文地址:http://www.cnblogs.com/zmyvszk/p/5642162.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!