zoukankan      html  css  js  c++  java
  • 0123买卖股票最佳时机III Marathon

    给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

    设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

    注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

    示例 1:

    输入:prices = [3,3,5,0,0,3,1,4]
    输出:6
    解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。
      随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。
    示例 2:

    输入:prices = [1,2,3,4,5]
    输出:4
    解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。  
      注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。  
      因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
    示例 3:

    输入:prices = [7,6,4,3,1]
    输出:0
    解释:在这个情况下, 没有交易完成, 所以最大利润为 0。
    示例 4:

    输入:prices = [1]
    输出:0

    提示:

    1 <= prices.length <= 105
    0 <= prices[i] <= 105

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii

    参考:

    python

    # 0123.买卖股票最佳时机III
    
    class Solution:
        def maxProfit(self, prices: [int]) -> int:
            """
            动态规划, 股票问题, 至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖
    
            一天一共就有五个状态:
            0.没有操作
            1.第一次买入
            2.第一次卖出
            3.第二次买入
            4.第二次卖出
    
            dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金
    
            dp[i][1]状态,有两个具体操作:
            操作一:第i天买入股票了,那么dp[i][1] = dp[i-1][0] - prices[i]
            操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1]
            dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1])
            dp[i][2]也有两个操作:
            操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]
            操作二:第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2] = dp[i - 1][2]
            所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])
            同理可推出剩下状态部分:
            dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
            dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i])
    
            初始化:
            dp[0][0] = 0
            dp[0][1] = -prices[0]
            dp[0][2] = 0
            dp[0][3] = -prices[0]
            dp[0][4] = 0
    
            :param prices:
            :return:
            """
            if len(prices) == 0: return 0
            dp = [[0]*5 for _ in range(len(prices))]
            dp[0][1] = -prices[0]
            dp[0][3] = -prices[0]
            for i in range(1, len(prices)):
                dp[i][0] = dp[i-1][0]
                dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i])
                dp[i][2] = max(dp[i-1][2], dp[i-1][1]+prices[i])
                dp[i][3] = max(dp[i-1][3], dp[i-1][2]-prices[i])
                dp[i][4] = max(dp[i-1][4], dp[i-1][3]+prices[i])
            return dp[len(prices)-1][4]
    

    golang

    package dynamicPrograming
    
    // 动态规划-股票问题III
    func maxProfit3(prices []int) int {
    	if len(prices) == 0 {return 0}
    	dp := make([][]int, len(prices))
    	for i:=0;i<len(prices);i++ {
    		dp[i] = make([]int, 5)
    	}
    	dp[0][1] = -prices[0]
    	dp[0][3] = -prices[0]
    	for i:=1;i<len(prices);i++ {
    		dp[i][0] = dp[i-1][0]
    		dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i])
    		dp[i][2] = max(dp[i-1][2], dp[i-1][1]+prices[i])
    		dp[i][3] = max(dp[i-1][3], dp[i-1][2]-prices[i])
    		dp[i][4] = max(dp[i-1][4], dp[i-1][3]+prices[i])
    	}
    	return dp[len(prices)-1][4]
    }
    
    func max(a,b int) int {
    	if a > b {return a}
    	return b
    }
    
  • 相关阅读:
    Nginx负载均衡+代理+ssl+压力测试
    Nginx配置文件详解
    HDU ACM 1690 Bus System (SPFA)
    HDU ACM 1224 Free DIY Tour (SPFA)
    HDU ACM 1869 六度分离(Floyd)
    HDU ACM 2066 一个人的旅行
    HDU ACM 3790 最短路径问题
    HDU ACM 1879 继续畅通工程
    HDU ACM 1856 More is better(并查集)
    HDU ACM 1325 / POJ 1308 Is It A Tree?
  • 原文地址:https://www.cnblogs.com/davis12/p/15636403.html
Copyright © 2011-2022 走看看