leetcode 198.打家劫舍
题目:
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
分析:
这个题目是一个非常明显的动态规划问题,首先题目规定你不可以连续偷窃,其次每一家现金的数额不可能是负数,所以不必担心当前已偷金额会减少的问题。
过程:
所以可以推导出当前应偷金额的最大数目为dp[n]=(dp[n-2]|dp[n-3])+nums[n],但是在最后一家和倒数第二家会存在绝对有一家不能偷窃的问题,所以最大金额不能只看最后一家的最大金额,返回的数字应该取这两家之间的较大值。
代码:
我把比较简单容易理解的深搜代码也贴上了一份
1 class Solution { 2 int tol; 3 int max=0; 4 public int rob(int[] nums) { 5 if(nums.length<1) 6 return 0; 7 if(nums.length==1) 8 return nums[0]; 9 int rec[]=new int[nums.length]; 10 rec[0]=nums[0]; 11 rec[1]=nums[1]; 12 for(int n=2;n<nums.length;++n) { 13 if(n-3>=0) 14 rec[n]=(rec[n-2]>rec[n-3]?rec[n-2]:rec[n-3])+nums[n]; 15 else 16 rec[n]=rec[n-2]+nums[n]; 17 } 18 return rec[nums.length-1]>rec[nums.length-2]?rec[nums.length-1]:rec[nums.length-2]; 19 } 20 /* 21 * 深搜时间太长,不推荐 22 public void dfs(int[] nums,int step) { 23 if(step+2>=nums.length&&tol>max) { 24 max=tol; 25 return; 26 } 27 for(int n=step+2;n<nums.length&&n<step+4;++n) { 28 tol=tol+nums[n]; 29 dfs(nums,n); 30 tol=tol-nums[n]; 31 } 32 } 33 */ 34 }