动态规划问题总结
动态规划题型难点
- 首先找不到dp的规律是什么
- 不知道什么时候开始,什么时候结束
- 不知道该用遍历还是递归(这个其实两个都一样,只是看个人更喜欢用那一种)
挨个解决
-
首先对于找不到dp规律的,其实无非就那几种。后一个是在前一个或者前几个当中取最小/最大值,然后就可以得出类似这样的,dp[i] = Math.max(dp[i - 1]+条件, dp[i - 2] + 条件.....)+条件。基本上动态规划类型的题都素这样,然后知道大概规律了,接下来就是去做题然后巩固一下。
509.斐波那契数
1137. 第 N 个泰波那契数
70. 爬楼梯
198. 打家劫舍 -
不知道什么时候开始,什么时候结束。
对于这个问题我个人的解决方案就是在题型中分析,比如第198题打家劫舍中,小偷不能连续偷两家挨到的,也就是说从第一二层记录,从第三层开始,因为第一层或者第二层是可以一次就偷到,接下来就需要看第三层去判断dp[2] = Math.max(dp[0] + num[2], dp[1])。所以你懂了吗?(不懂就肯定是题没刷够,hxd,建议多刷几套题,题感就出来了)
3.遍历和递归
在动态规划的问题当中,我做多了题的感觉就是,当你可以只用数组去解决这个题,那么只需要遍历,将结果数组遍历一遍就得行了。但是当你使用数组不能解决这个问题的时候,可能就需要去使用递归然后进行判断或者是其他的一些操作去辅助遍历数组。
行百里者半九十