[leetcode] 股票问题

Posted sinkinben

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[leetcode] 股票问题相关的知识,希望对你有一定的参考价值。

参考文章:

其实文章 [1] 是文章 [2] 的「二次创作」,建议先阅读 [2] 后再阅读 [1] 。文章 [2] 最大的亮点是使用了状态机图对股票问题进行建模和描述,我觉得是写得很好的文章(因为动态规划最原始的数学模型就是状态机)。

本文通过的题目有:

预备知识

股票买卖问题的本质是状态穷举。或者说,其实大部分动态规划问题都是状态穷举,只不过是某个状态的计算不是从初始条件开始计算,而是依赖于已经计算过的若干个状态。

股票问题面临的因素有三个:天数 \\(N\\) 、最大交易次数 \\(K\\) 、在某天股票的持有状态 \\(S(S\\in\\{0,1\\})\\)

  • 状态定义

dp[i][k][s] 表示在第 i 天,最大交易次数为 k ,当前股票持状态为 s 的情况下的最大利润。其中,\\(0 \\le i \\le n-1, 1 \\le k \\le K, 0 \\le s \\le 1\\) .

显然,股票问题所需的结果是 dp[n-1][K][0] 。为什么不是 dp[n-1][K][1] 呢?因为该状态表示持有股票,最后需要的结果当然是不持有股票的,卖出才具有最大利润。

  • 转移方程

假设在第 i 天,最大交易次数为 k ,进行操作后没有持有股票,该状态依赖于:

  1. i-1 天持有股票,但是第 i 天卖出,即 dp[i-1][k][1] + price[i]
  2. i-1 天就不持有股票,即 dp[i-1][k][0]

假设在第 i 天,最大交易次数为 k ,进行操作后持有股票,该状态依赖于:

  1. i-1 天就持有股票,第 i 天什么都不做,即 dp[i-1][k][1]
  2. i-1 天不持有股票,第 i 天购入股票,即 dp[i-1][k-1][0] - price[i] 。因为第 i 天需要进行一次交易操作,所以要求前一天的交易次数减一。

所以有:

dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1] + price[i])    if i>=1 and k>=1
dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0] - price[i])  if i>=1 and k>=1
dp[0][k][0] = 0                                               if i==0 and k>=1
dp[0][k][1] = -price[0]                                       if i==0 and k>=1

第三个下标只有 0 和 1 ,所以我个人更偏向于将这个三维数组拆分为 2 个二维数组:

dp0[i][k] = max(dp0[i-1][k], dp1[i-1][k] + price[i])    if i>=1 and k>=1
dp1[i][k] = max(dp1[i-1][k], dp0[i-1][k-1] - price[i])  if i>=1 and k>=1

本文就采用 2 个二维数组的形式去解题。

  • 边界条件

边界的发生主要发生在变量 ik 上,具体条件是 i == -1 k == 0

dp[-1][k][0] = 0, dp[-1][k][1] = -INF
dp[i][0][0] = 0, dp[i][0][1] = -INF

dp[-1][k][0] 表示允许交易(即 \\(k \\ge 1\\)),但时间未开始(一个形象比喻:股票交易市场未开市),手上未持有股票,利润固然为 0 .

dp[i][0][0] 表示不允许交易,股票市场开市,所以利润为 0 .

dp[-1][k][1] 表示允许交易,股票市场未开市,但手中已持有股票,该状态是不可能的。

dp[i][0][1] 表示不允许交易,股票市场开市,但手中已持有股票,该状态也是不可能的。

因为求解过程中需要取 max ,所以不可能状态以最小值 -INF 表示。

买卖股票的最佳时机

题目[121]:

以上是关于[leetcode] 股票问题的主要内容,如果未能解决你的问题,请参考以下文章

protel 99se安装后原理图文件出错

在protel中,布完线后出现Width Constraint 违规能制作出板子吗?

protel99se原理图标题栏怎么更改

protel99se在win10下运行pcb能打开sch打不开啥原因,会出现下图对话框。

用protel做PCB图怎样允许元件重叠

在protel 99se中如何设置PCB的尺寸