/** <p>你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 <strong>围成一圈</strong> ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,<strong>如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警</strong> 。</p> <p>给定一个代表每个房屋存放金额的非负整数数组,计算你 <strong>在不触动警报装置的情况下</strong> ,今晚能够偷窃到的最高金额。</p> <p> </p> <p><strong>示例 1:</strong></p> <pre> <strong>输入:</strong>nums = [2,3,2] <strong>输出:</strong>3 <strong>解释:</strong>你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。 </pre> <p><strong>示例 2:</strong></p> <pre> <strong>输入:</strong>nums = [1,2,3,1] <strong>输出:</strong>4 <strong>解释:</strong>你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。</pre> <p><strong>示例 3:</strong></p> <pre> <strong>输入:</strong>nums = [1,2,3] <strong>输出:</strong>3 </pre> <p> </p> <p><strong>提示:</strong></p> <ul> <li><code>1 <= nums.length <= 100</code></li> <li><code>0 <= nums[i] <= 1000</code></li> </ul> <div><div>Related Topics</div><div><li>数组</li><li>动态规划</li></div></div><br><div><li>👍 1100</li><li>👎 0</li></div> */ //leetcode submit region begin(Prohibit modification and deletion) class Solution { public int rob(int[] nums) { //三种选择,第一种选头不选尾,第二种选尾不选头,第三种不选头不选尾。 int n = nums.length; if(n==1){ return nums[0]; } int[] dp = new int[n+2]; for (int i = n-2; i >=0 ; i--) { dp[i]=Math.max(dp[i+1],dp[i+2]+nums[i]); System.out.println(dp[i]); } int[] dp1 = new int[n+2]; for (int i = n-1; i >=1 ; i--) { dp1[i]=Math.max(dp1[i+1],dp1[i+2]+nums[i]); System.out.println(dp1[i]); } return Math.max(dp[0],dp1[1]); } } //leetcode submit region end(Prohibit modification and deletion)
不会,我可以学;落后,我可以追赶;跌倒,我可以站起来!