LeetCode股票问题通解(一)

本文介绍一种通用的动态规划方法,用于解决LeetCode中的股票问题,包括121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 II、309. 最佳买卖股票时机含冷冻期和714. 买卖股票的最佳时机含手续费等。通过三维数组存储状态,并给出状态转移方程,简化问题理解与代码实现。
摘要由CSDN通过智能技术生成

在这里插入图片描述
股票问题是动态规划中一类很恶心的题目,大家可以自己先去做一下,你一定会发现各个股票的问题解法都不一样,奇淫技巧特别多,让人觉得,我怎么想得到?再让我做一遍我也做不出来!

那么今天,我将告诉大家一个通用的方法,一个方法,解决6道股票问题。同时也要感谢leetcode用户fun4LeetCode,本文参考:https://urlify.cn/zYbu2a

首先,我们用一个三维数组来存储状态的组合:

dp[i][k][f]
i为第i天,k为交易次数,f为手中是否有股票(0\1)

dp[3][2][1] 的含义:
今天是第三天,我现在手上持有着股票,已经交易了2次
dp[2][3][0] 的含义:
今天是第二天,我现在手上没有持有股票,已经交易了3次

我们想求的最终答案是dp[n-1][K][0],
即最后一天,K次交易之后,最多获得多少利润。
0代表股票已经卖出去了。

那么我们可以很容易的写出状态转移方程:

dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1] + prices[i])
解释:第i天我没有持有股票,有两种可能:
要么是我昨天就没有持有,然后今天选择“闲着”,
所以我今天还是没有持有;

要么是我昨天持有股票,但是今天我“卖了”,
所以我今天没有持有股票了。


dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0] - prices[i])
解释:第i天我持有着股票,有两种可能:
要么我昨天就持有着股票,然后今天选择“闲着”,
所以我今天还持有着股票;

要么我昨天本没有持有,但今天我选择“买入”,
所以今天我就持有股票了。

好了。基本框架解释完毕,我们来看题:

121. 买卖股票的最佳时机

在这里插入图片描述
这道题直接套状态转移方程:

dp[i][1][0] = max(dp[i-1][1][0], dp[i-1][1][1] + prices[i])
dp[i][1][1] = max(dp[i-1][1][1], dp[i-1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值