[算法数据结构] 买定离手!动态规划如何解决股票问题

79 阅读2分钟

买卖股票问题中,如何抽象出当前的状态。相比于之前的背包问题,放/不放。股票存在买/不买的选择。但是倘若以这个为状态,反而不好通过之前的状态来推出当前的状态。将问题转换为手中有/没有股票能够好的表示。为什么?当前有股票 = {之前有股票,没有股票的状态 买入股票} 当前没股票 = {之前没有股票,之前有股票 卖出股票}。看似有差异,但能体现出功力还不够深厚,没有办法选出一种合适的状态表示方法。

  • 买卖股票的最佳时机

dp[i][0] 第i天持有股票所得最多现金;dp[i][1] 第i天不持有股票所得最多现金。 dp[i][0] = max(dp[i - 1][0], 0 - prices[i]) 因为只买卖一次,因此,不持有股票的状态恒为0 dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i])

  • 买卖股票的最佳时机II

可以买卖多支股票,因此,递推公式如下所示。 dp[i][0] 第i天持有股票所得最多现金;dp[i][1] 第i天不持有股票所得最多现金。 dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]) 因为之前已经买卖过股票,需要用不持有股票的值去减prices[i]。 dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i])

通过二维数组来维护两个状态。持有股票和没有持有股票。

  • 买卖股票的最佳时机III

难点在于如何想到通过增加状态来推出最多利润。规定了最多可以完成两笔交易。之前没有规定次数的时候,仅仅是两种状态:持有股票/不持有股票,不用考虑第几次。在规定次数之后,一天的状态增加为五个,0没有操作,1 第一次买入 2 第一次卖出 3 第二次买入 4 第二次卖出。

  • 买卖股票的最佳实际IV

k次交易,和上面一题同理。