描述
该题来自于力扣第123题
分析
力扣第122题题解附录的通用解法的状态转移方程为:
1
2dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1] + prices[i])
dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0] - prices[i]) # 由于买入算交易依次,从而是k-1次不持有的状态
该题中k=2
,从而转移方程直接写出来,注意dp[i-1][0][0]=0
因为不交易不持有当然是0
1
2
3
4dp[i][2][0] = max(dp[i-1][2][0], dp[i-1][2][1] + prices[i])
dp[i][2][1] = max(dp[i-1][2][1], dp[i-1][1][0] - prices[i])
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], -prices[i])
状态只依赖前一次,所以空间可以优化,注意更新顺序(就按照上面的顺序从上万下更新,正好不会影响状态之间的依赖)
1
2
3
4dp[2][0] = max(dp[2][0], dp[2][1] + prices[i])
dp[2][1] = max(dp[2][1], dp[1][0] - prices[i])
dp[1][0] = max(dp[1][0], dp[1][1] + prices[i])
dp[1][1] = max(dp[1][1], -prices[i])
甚至可以直接用四个变量来表示上面四个值,最终结果显示是dp[2][0]
,交易了2
次不持有股票的状态。
代码
1 | class Solution: |