leetcode-dp-213


/**
<p>你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 <strong>围成一圈</strong> ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,<strong>如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警</strong> 。</p>

<p>给定一个代表每个房屋存放金额的非负整数数组,计算你 <strong>在不触动警报装置的情况下</strong> ,今晚能够偷窃到的最高金额。</p>

<p>&nbsp;</p>

<p><strong>示例&nbsp;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)。
&nbsp;    偷窃到的最高金额 = 1 + 3 = 4 。</pre>

<p><strong>示例 3:</strong></p>

<pre>
<strong>输入:</strong>nums = [1,2,3]
<strong>输出:</strong>3
</pre>

<p>&nbsp;</p>

<p><strong>提示:</strong></p>

<ul>
	<li><code>1 &lt;= nums.length &lt;= 100</code></li>
	<li><code>0 &lt;= nums[i] &lt;= 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)

posted @ 2022-07-20 09:46  小傻孩丶儿  阅读(14)  评论(0编辑  收藏  举报