Day 42 - 动态规划 Part09

29 阅读2分钟

基础

刷题

  1. 买卖股票的最佳时机 IV

leetcode.cn/problems/be…

image.png

动规五部曲:

  • 确定dp数组定义

第i天第k次持有股票的最大金额 是 dp[i][2*k-1]

第i天第k次不持有股票的最大金额是 dp[i][2*k]

  • 确定dp数组的递推公式

dp[i][2*k-1] = max(dp[i-1][2*k-1], dp[i-1][2*k-2] - prices[i])

dp[i][2*k] = max(dp[i-1][2*k], dp[i-1][2*k-1] - prices[i])

  • 确定dp数组的初始化

dp[i][0] = 0  // 代表0次操作,就是不操作,不操作就没有盈亏
dp[0][奇数] = -prices[0]   
dp[0][偶数] = 0
// 当第一天进行第二次买入操作的时候,可以理解为没有执行第一次买卖操作

  • 确定dp数组遍历顺序

从左向右,从上到下

  • 打印dp数组

image.png

  1. 买卖股票的最佳时机含冷冻期

leetcode.cn/problems/be…

image.png

这道题讲解的很难,很多状态,但是用之前的思路,使用两个状态,一个是持有股票,一个是不持有股票的状态

dp[i][0]i天持有股票的状态
dp[i][-1]i天不持有股票的状态

dp[i][0] = max(dp[i-1][0], dp[i-2][1] - prices[i])
dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i])
 
  1. 买卖股票的最佳时机含手续费

leetcode.cn/problems/be…

image.png

和之前一样的,就是在买股票的时候扣除手续费

总结

个人总结:

  • dp数组是记录遍历过程中的状态,可以先想一下如何构造递推公式,需要用到或者记录哪些变量,再去定义dp数组
  • 在初始化dp数组的时候,遇到非法的0值 或者初始化的值,可以代入递推公式,找到需要的初始化数据