leetcode-dp-213
/**
<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)
不恋尘世浮华,不写红尘纷扰