状态机动态规划之股票问题

本文介绍了动态规划解决股票问题,包括卖股票的最佳时机 III 和 IV。在最佳时机 III 中,允许进行两笔交易,通过状态机分析得出动态规划状态转移方程,并给出代码实现。在最佳时机 IV 中,扩展到最多 k 笔交易,分析状态表示和状态转移方程,同样提供代码解法。动态规划中涉及多种状态变化,理解状态转移有助于解决这类问题。
摘要由CSDN通过智能技术生成

卖股票的最佳时机 III

题目

给定一个数组,它的第 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 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

状态表示数组和状态转移

在这道题目当中我们也是二维数组进行状态的表示,二维数组为dp[N][5],5表示我们有5个状态,dp[N][i]表示第N天的第i个状态能够多大的收益!(为了方便下面介绍,假设一天有一个股票,dp[N][]表示第N天的状态,对应第N个股票的状态)

  • dp[N][0],表示第N天一次买入和卖出的操作都没有过,那么dp[N][0] = dp[N - 1][0],跟前一天的状态一样,都没有进行股票的买入和卖出,其实也可以直接令dp[N][0] = 0,因为没有进行操作我们的收益肯定等于0。
  • dp[N][1],表示第N天已经进行过第一次买入,这个买入可以是在第N天进行买入,也可以在前面N-1天买入,然后在第N天保持状态。如果第N天刚刚进行买入,那么我们的收益就是从前一天一次买入和卖出都没有操作转移过来的,那么就有dp[N][0] - prices[i],因为根据上面的分析dp[N][0] = 0,那么直接让dp[N][1] = -prices[i]即可。如果在前N-1天已经进行了买入,那么在第N天就不行操作,即在第N天收入为0,即dp[N][1] = dp[N - 1][1]。
  • dp[N][2],表示第N天已经进行过第一次卖出,这个状态可以是在第N天进行卖出,也可以是在前面N-1天已经卖出,然后在第N天保持状态如果在第N天进行第一次卖出那么我们在第N天的收益就等于prices[i],再加上前N-1天买入一次的收益,即dp[N][2] = dp[N - 1][1] + prices[i]。如果前N-1天已经卖出,那么直接保持状态即可,我们在第N天的收益就为0,那么dp[N][2] = dp[N - 1][2]。
  • dp[N][3],表示第N天已经进行过第二次买入,这个状态可以是在第N天进行买入,也可以是在前面N-1天买入,然后在第N天保持状态。如果在第N天进行第二次买入那么我们在第N天的收益就等于-prices[i],再加上前N-1天买入卖出一次的收益,即dp[N][3] = dp[N - 1][2] - prices[i]。如果前N-1天已经有了第二次买入的操作,那么直接保持状态即可,我们在第N天的收益就为0,那么dp[N][3] = dp[N - 1][3]。
  • dp[N][4]&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值