我们通过记住一些事情来节省时间,这就是动态规划的精髓。
表示状态之间转换关系的图叫状态机
无后效性从字面上意思可以理解为:一旦一个阶段的结果计算出来,后面阶段的求解过程不会影响前面阶段的计算结果。动态规划,通过递推求解问题的过程可以看成一张有向无环图。
- 有向:多阶段递推求解;
- 无环:即无后效性。
「无后效性」是设计「动态规划」问题非常重要的指导思想,为了使得求解的过程满足「无后效性」,通常的做法是在设计状态的时候在后面多加一维。
「无后效性」这个概念相对比较晦涩,需要通过一定的练习才能充分理解,这里推荐「力扣」第 53 题、第 300 题、第 5 题、第 337 题、第 1143 题、第 152 题、第 72 题这几个极其典型的问题。欢迎交流。
股票问题通用模板:
符号:
T[i][k]:第i天结束时,最多进行k次交易的情况下可以获得的最大收益
T[i][k][0]:第i天结束时,最多进行k次交易且进行操作后持有0份股的情况下可以获得的最大收益
T[i][k][1]:第i天结束时,最多进行k次交易且进行操作后持有1份股的情况下可以获得的最大收益
⭐初始化:
T[-1][k][0]=0,T[-1][k][1]=-∞
T[i][0][0]=0,T[i][0][1]=-∞
状态转移方程:
T[i][k][0]=max(T[i-1][k][0], T[i-1][k][1]+prices[i])
T[i][k][1]=max(T[i-1][k][1], T[i-1][k-1][0]-prices[i])
二维dp数组的初始化:
vector<vector<int>> dp(size,vector<int>(2,0));