- DP思想:
再不触发警报的前提下偷到第i间屋子能偷窃到的最高金额 = 偷到第i-2间屋的最高金额+第i间屋有的金额(这个思路是错的!!!)
而是,小偷在路过某个房间时可以决定偷与不偷,而且不一定非得隔一个房间偷一次(只是不能连续偷取相邻房间里的钱)。比如[1,2,100,1,2,100]能偷取的最大金额应该是200(这就是不是隔一个房间偷一次) - 所以,这个DP思想应该这么想:
小偷路过第i号房间时身上已偷到的最大金额res[i] = max(res[i-2]+nums[i],res[i-1])
怎么理解?小偷路过第i号房间有两种选择:
case1 :偷第i号房间,要使能够在不触发警报的前提下偷到第i间屋子那么在路过第i-1号房间时小偷只能啥也不干也就是不能偷,所以此时dp[i-1]只能=dp[i-2]也就是再路过第i-1号房间时只做case2选择,所以.能偷窃到的最高金额 = 偷到第i-2间屋的最高金额+第i间屋有的金额(,所以此时res[i] = res[i-2]+nums[i]
case2:不偷第i号房间此时,该小偷身上的最大金额即为路过第i-1号房间所持有的金额也就是此时res[i]=res[i-1]
那么最终小偷路过第i号房间所持有的最大金额当然就是case1与case2两者中的最大值
最终,小偷走过最后一个房间后所持有的金钱即为能偷到的最大金额
class Solution {
public int rob(int[] nums) {
if(nums.length==0) return 0;
if(nums.length==1) return nums[0];
int[] res = new int [nums.length];
//因为第0与第1号房间不能用上面的DP公式所以先初始化
res[0] = nums[0];
res[1] = Math.max(nums[1],res[0]);
for(int i=2;i<nums.length;i++){
res[i] = Math.max(res[i-2]+nums[i],res[i-1]);
}
return res[nums.length-1];
}
}