买卖股票问题
📸

买卖股票问题

text
掌握动态规划基础的前提下,对”买卖股票的最佳时机“问题的方法的总结输出
Tags
动态规划
刷题
算法题
Created
Apr 13, 2022 02:48 PM

经典问题

简述:存在股票的价格数组,只能选择某一天买入的股票,并在未来某一个不同的日子卖出,计算最大利润。

思路

关键思路在于:”买入卖出“ >> “持有不持有”,因为dp记录状态的时候,“持有不持有”才是一种持续的状态,即额外记录状态即可
动态规划五部曲分析:
1、确定dp数组以及下标的含义
dp[i][0]表示第i天持有股票的最多现金;dp[i][1]表示第i天不持有股票的最多现金;买入时扣除花费金额
2、确定递推公式
  • 第i天持有股票dp[i][0]可由以下两者状态所致
    • 第i-1天就已经持有,保持现状,即dp[i-1][0]
    • 第i天买入,即-price[i](股票价格)
    • 即dp[i][0] = max(dp[i-1][0], -price[0])
  • 第i天不持有股票dp[i][1]可由两者状态所致
    • 第i-1天就已经不持有,保持现状,即dp[i-1][1]
    • 第i天卖出了股票,即dp[i-1][0] + price[i]
    • 即dp[i][1] = max(dp[i-1][1], dp[i-1][0]+price[i])
3、dp数组如何初始化
基础在于dp[0][0]和dp[0][1],即dp[0][0]=-price[0],dp[0][1]=0
4、确定遍历顺序,即从前向后
5、举例推导dp数组
注:链接中图解更方便理解

拓展题型

股票买卖的最佳时机II

约束条件:可以多次交易,但不准同时持有多支股票
解题思路:递归公式的改变
  • 即dp[i][0] = max(dp[i-1][0], dp[i-1][1]-price[i])

股票买卖的最佳时机III

约束条件:最多买入K次股票,不准同时持有多支股票
解题思路:
  • K为2时的情况
    • 分为5个状态,分别为没有操作、第一次买入、第一次卖出、第二次买入、第二次卖出;即dp[i][j]表示第i天,j为[0-4]五个状态
    • dp[i][1] = max(dp[i-1][0] - price[i], dp[i-1][1])
    • dp[i][2] = max(dp[i-1][1] + price[i], dp[i-1][2])(同理可得dp[i][3]和dp[i][4])
  • K可为任何值时的通解
    • 参考上述K=2时可以得出状态数为2*K+1个,分别讨论即可

参考