
思路;首先读了一遍题目发现是读懂了,刚开始以为要用贪心,但是不对,贪心是求局部最优解,但很明显这道题不是求局部最优,不是局部最优得到,而是选择局部最优得到,因为需要选择局部最优,所以需要使用动态规划。
核心就是,贪心只会做单向的决定,不会回头考虑其他的分支,即当前位置他因为局部的规则(比如选最大)他选择了那么他就不会考虑如果不选择当前的节点能不能得到最大,而这道题的房间因为相邻会报警,所以当前房间有选or不选这两种情况。所以使用动态规划。
那么动态规划的下标和dp数组的含义应该如何确定呢,用为题目要求的是当前房间下能盗取的最大的钱数,所以下标i表示当前是在第几个房间,那么dp[i]就是表示在当前这个房间下能取得的最大值。
那么如何推导出状态转移方程呢,首先举出一个1,2的例子 我写的状态转移方程是,dp(2) = Math.max(dp(1),nums[1])(注意这里的数组下标是从0开始)
这个式子在1,2是成立的,那么如果举出的例子是1,2,2呢
于是我根据1,2,2这个样例写出了dp(i) = Math.max(dp(i - 1),dp(i - 2) + nums[i - 1];
于是我开始写代码:
第一版:

看到这个报错以为自己状态转移方程写错了,没有很快的想到原因,我应该把执行的每个房间的最大值给列出来这样可以更好的发现问题,
然后发现问题是这里写错了修改后的代码: