在做动态规划类题目时最大的感觉就是能够分析出这道题目需要用动态规划算法来解,却没有办法构建出解题步骤,看到别人的分析时候又感觉代码很简单但是自己却想不出。
其实这还是没有理解到动态规划算法的基本思想。
这里我们通过一道例题来进行分析
由于相邻房屋不能偷,如果我们从前往后思考当我们偷第一家那么我们就不能偷第二家,如果我们偷第二家我们就不能偷第三家…这时发现我们每走一步问题都为发生改变。
此时我们就应该换个角度思考从后往前看:
假如我们现在有5家房屋
当我们选择偷第五家的时候,那么最大金额 = 第五家金额 + 前三家偷窃的最优解。
当我们不偷第五家的时候,那么最大金额 = 前四家偷窃的最优解。
这时候我们就能明白:如果只有一种情况时,最佳的选择应该怎么做.然后根据这个最佳选择往前一步推导,得到前一步的最佳选择。
这道题最主要的部分就是要分析出每一步的最优解然后往后递推。
我们来结合示例2进行分析:
输入为:[2,7,9,3,1]
我们使用一个dp[]数组储存我们没阶段的最优解
(1)假设起始状态下没有房屋时最优解为:0
dp[0]=0(可以看作0房屋时候的最优解)
(2)如果只存在第一家的时候那么最优解为:2
dp[1]=