1.1 KiB
1.1 KiB
总结
和贪心相似,从将问题划分为多个子问题,最后得出最终问题的解,但是区别在于每一步之间涉及到状态推导,下一步是基于上一步的结果和之前的记忆(也就是上上次,上上上次等的结果)经过一定逻辑推导得出的。
分五步:
- 确定
dp[i]
是什么 - 确定递推公式
dp
数组如何初始化- 确定遍历顺序(从前向后还是从后向前)和范围
- 推几个来验证
如何确定遍历顺序?除了背包问题外,一般减法从前往后,加法从后往前。参考子序列问题——回文串。
为什么一般是这样?你遍历几个试试看就知道了。
如何确定初始化方法?确定了遍历顺序以及遍历范围后,再遍历几个试试。
技巧:
- 如果可以的话,初始化
dp
的长度,而不要每次都dp.push_back()
。初始化能够有更好的性能。 - 知道用 DP ,也知道
dp[i]
应该用来表示什么,但不知道递推关系。这个时候多举几个简单的例子找规律(s0096)。