LeetCode309. 最佳买卖股票时机含冷冻期(动态规划)

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

 
/*
计算最大利润,不能同时参与多笔交易,卖出后无法在第二天买入(冷冻期为1天)

动态规划
	每一天会有三种不同的状态:
		1. 目前持有一支股票,对应的[累计最大收益]为dp[i][0]
		2. 目前不持有任何股票,且处于冷冻期中,对应的[累计最大收益]为dp[i][1]
		3. 目前不持有任何股票,且不处于冷冻期中,对应的[累计最大收益]为dp[i][2]
		注意:这里处于冷冻期是指第二天即i+1不处于冷冻期

	状态转移:
		1. 目前持有一支股票,可以是dp[i-1][0]就持有的股票,
           也可以是不处于冷冻期然后新买入的股票,即dp[i-1][2]-prices[i],
           dp[i][0] = max(dp[i-1][0], dp[i-1][2]-prices[i])
		2. 目前不持有任何股票,且处于冷冻期中,
		   则应该是卖出了前一天持有的股票,即dp[i][1] = dp[i-1][0]+prices[i]
	    3. 目前不持有任何股票,且不处于冷冻期中,
		   dp[i][2] = max(dp[i][1], dp[i][2])

	最终结果即为res = max(dp[n][1], dp[n][2]),最后一天持有股票没有意义
	初始状态dp[0] = (-prices[0], 0, 0)
	由于只用到了前一天的状态,因此可以进行空间压缩
 */
func maxProfit(prices []int) int {
	dp := [3]int{}
	dp[0] = -prices[0]
	size := len(prices)

	for i := 1; i < size; i++ {
		old0 := dp[0]
		dp[0] = max(dp[0], dp[2]-prices[i])
		old1 := dp[1]
		dp[1] = old0 + prices[i]
		dp[2] = max(old1, dp[2])
	}

	return max(dp[1], dp[2])
}

/**
返回两个整数中的较大值
 */
func max(i int, j int) int {
	if i >= j {
		return i
	}
	return j
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值