• 最佳买卖股票时机含冷冻期


    题目描述:

    给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。

    设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

    你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示例:

    输入: [1,2,3,0,2] 输出: 3 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

    解题思路:

    第一步:状态定义

    dp[i][j] 表示[0, i]区间内,在下标为i这一天状态为j时的最大收益。

    这里j取三个值:

    • 0 表示不持股;
    • 1 表示持股;
    • 2 表示处在冷冻期。

    第二部:状态转移方程

    这步是至关重要也是最难的,得知状态转移方程的关键是理解题意,理清逻辑。

    • 不持股可以由这两个状态转换而来:昨天不持股,今天什么都不操作,仍然不持股;昨天持股,今天卖了一股。
    • 持股可以由这两个状态转换而来:昨天持股,今天什么都不操作,仍然持股;昨天处在冷冻期,今天买了一股;
    • 处在冷冻期比较特殊,只可以由不持股转换而来,因为题目中说,刚刚把股票卖了,需要冷冻 1 天。(持股卖了变成不持股,再变成冷冻期)

    以上分析可以用下图表示:

    第三步:初始化(base case)

    在第 0 天,不持股的初始化值为 0

    持股的初始化值为 -prices[0](表示购买了一股),

    虽然不处于冷冻期,但是初始化的值可以为 0

    第四步:返回值

    每一天都由前面几天的状态转换而来,最优值在最后一天。取不持股和冷冻期的最大者。

    package main
    
    //go
    func maxProfit(prices []int) int {
    	length := len(prices)
    	// 特殊判断
    	if length <= 1 {
    		return 0
    	}
    	// 声明dp
    	dp := make([][3]int, length)
    	// 初始化
    	dp[0][0] = 0          // 【0天】【不持股】
    	dp[0][1] = -prices[0] // 【0天】【持股】
    	dp[0][2] = 0          // 【0天】【冷冻期】
    
    	for i := 1; i < length; i++ {
    		// 【第i天】【不持股】 = max(昨天不持股今天不操作,昨天持股+今天卖一股)
    		dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i])
    		// 【第i天】【持股】 = max(昨天持股今天不操作,昨天冷冻期+今天买一股)
    		dp[i][1] = max(dp[i-1][1], dp[i-1][2]-prices[i])
    		// 【第i天】【冷冻期】 = 昨天卖了不持股
    		dp[i][2] = dp[i-1][0]
    	}
    
    	// 返回不持股和冷冻期的最大者
    	return max(dp[length-1][0], dp[length-1][0])
    }
    
    func max(x, y int) int {
    	if x > y {
    		return x
    	}
    	return y
    }
    
    func main() {
    	var num = []int{1,2,3,0,2}
    	maxProfit(num)
    }
    

      地址:https://mp.weixin.qq.com/s?__biz=MzU1NjAyOTMyMQ==&mid=2247484291&idx=1&sn=cfec9d50f8b93f91fe63c51a3b60e5cb&chksm=fbca0765ccbd8e73f47c68a13e72801202251325e4d0c1ffc507e80f45950fc386b67028cd84&scene=21#wechat_redirect

  • 相关阅读:
    SVN使用教程总结
    SVN
    js中设置元素class的三种方法小结
    Javascript 删除tr 元素
    SQL Server执行计划的理解
    java多线程知识点汇总(四)多线程知识点脉络图
    hibernate将connection放进threadlocal里实现数据库连接池
    数据库连接池中是将connection放进threadlocal里的
    java jdbc深入理解(connection与threadlocal与数据库连接池和事务实)
    java项目怎样添加jar包依赖?
  • 原文地址:https://www.cnblogs.com/smallleiit/p/13359067.html
Copyright © 2020-2023  润新知