zoukankan      html  css  js  c++  java
  • 309. Best Time to Buy and Sell Stock with Cooldown

        /*
         * 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];
            }
  • 相关阅读:
    Redis 服务端程序实现原理
    Redis 中的客户端
    Redis 中的数据持久化策略(AOF)
    Redis 中的数据持久化策略(RDB)
    Redis 中的数据库
    Redis 的底层数据结构(对象)
    Redis 的底层数据结构(压缩列表)
    Redis 的底层数据结构(整数集合)
    又离职了~
    如何救活被屏蔽的主机,继续开发工作
  • 原文地址:https://www.cnblogs.com/zmyvszk/p/5642162.html
Copyright © 2011-2022 走看看