动态规划随笔

2021.05.06 补充关于方向和数组存储内容的看法

DP本质上还是一个状态机,而且还是一个单向的状态机。先不管什么重叠子问题和最优化问题,只说他的本质,就是一个对所有状态间可能存在的转移的枚举,然后以n维向量的形式表示出来。这是一个memo。

沿着某一个“方向”,记录所有枚举的情况,然后得到答案。这个方向,在LCS里可能是字符串的下标,在股票问题里可能是天数,在楼梯里可能是上楼的过程(往上),在fib里可能是数字增大。当然这也体现出fib不算DP,只是一个memo,因为他没有可选的转移,每次只有一个选项。

DP也可以看成是逆向的递归。因此,DP的过程不一定是线性的、迭代的,也可以是递归的。只要有用来枚举的memo即可。

此外,DP中常见的状态压缩技巧,无非是对只有一种选择的情况的优化。比如买股票问题,如果股票只能买卖一次,那就没有必要记录股票当前的买卖次数了,反正买了立刻就变成买过,只有买过和没买过,而且转换也是固定的。再者,爬楼梯问题这种的,因为他只能往上,所以其实只要搞两个变量就行了,记录一下往前一步和两步的数量就完事了。

状态压缩同时也是对随便选的情况的优化。只有一种选择也是随便选的一个特例吧,因为只有一个选项,随便怎么选都不会产生决定性影响。

整个DP当中最复杂的部分,我觉得还是寻找边界情况。事实上通常情况下寻找决策并不麻烦,麻烦的是找到其中所有的边边角角。比如粉刷墙壁III这个问题,他的边界情况是相当麻烦的。

DP的“方向”,也就是沿着这个“方向”,记录所有枚举的情况,是由问题规模缩小的方向来决定的。有的题目是下标增大,有的题目是下标减小,有的是前序遍历,有的是后序遍历,本质上都是为了缩小问题规模。只有在DP的过程中问题不断变小,这才是一个正确的算法。算法的正确性就是由单调性和不变性决定的。

DP数组的内容,其实就是用来描述迭代过程中的snapshot。在迭代过程中的某个时间点,我需要什么样的信息来辅助决策,DP数组(或者momo)里就存储什么样的内容。比如最大子序列和,存储的是到当前下标为止的最大子序列和,这个一开始确实不好理解,但是在迭代过程中的某一个时刻,我需要到目前为止已知的最大和,这样我才能决定要不要增加;就是这么一个简单的判断标准罢了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值