menu

leetcode 198:打家劫舍

题目:你是一个专业的强盗,计划在街上抢劫房屋。 每个房子都藏着一定数量的钱,阻止你抢劫他们的唯一限制因素是相邻的房屋有连接的安全系统,如果两个相邻的房子在同一个晚上被闯入,它将自动联系警方。给出一个代表每个房子的金额的非负整数列表,确定今晚可以抢劫的最大金额而不警告警察。

注意:

  1. 如果我用dp[i]来表示第i家店偷得决策导致的后果,nums[i]表示第i家店的价值,那么dp[i-2]+nums[i])表示“偷”了第i家店的后果称为决策1后果;
  2. dp[i-1]就表示没偷得决策导致的后果称为决策2后果 那么我只需要每次去比较max(决策1后果,决策2后果) ——————— 原文:https://blog.csdn.net/rainmaple20186/article/details/80273009

我写的答案: class Solution { public int rob(int[] nums) { if(nums.length==0) return 0; int[] dp=new int[nums.length]; dp[0]=nums[0]; if(nums.length==1) return dp[0]; if(nums[1]>nums[0]) dp[1]=nums[1]; else dp[1]=nums[0]; if(nums.length==2) return dp[1]; for(int i=2;i<nums.length;i++) { if(dp[i-2]+nums[i]>dp[i-1]) dp[i]=dp[i-2]+nums[i]; else dp[i]=dp[i-1]; } return dp[nums.length-1]; } } 这里面动态的思维,上面的程序不一定是连续取值的,可出现连续两家都不偷的情况。 [7 1 2 5]动态规划的过程:当前[0]:7(偷) 当前[1]:7(不偷) 当前[2]:9(偷) 当前[3]:12。(偷意味跳到dp[i-2]那里的决策结果,而不是说一定要偷dp[i-2],就像这里的dp[1]也是不偷)注意这里的决策


还没想好

各种分享

微信搜索号: iris
wechat 微信号:ly.c