LeetCode-动态规划-213. 打家劫舍 II

213. 打家劫舍 II

思路:考虑三种情况注释代码中

class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.empty()) return 0;
        if(nums.size()==1) return nums[0];
        //考虑首端,不考虑尾端
        int value1 = robrange(nums,0,nums.size()-2);
        //考虑尾端,不考虑首端
        int value2 = robrange(nums,1,nums.size()-1);
        return max(value1,value2);
    }

    //考虑以下三种情况
    //1:不考虑首尾的情况
    //2:考虑首端情况
    //3:考虑尾端情况
    //由于情况1包含在情况2,3中,所以只要考虑后面两个即可
    int robrange(vector<int>& nums,int start,int end){
        if (end == start) return nums[start];
        vector<int> dp(nums.size(),0);  //第i个房间最高金额是dp[i]
        dp[start] = nums[start];
        dp[start+1] = max(nums[start],nums[start+1]);
        for(int i=start+2;i<=end;i++){
            dp[i] = max(nums[i]+dp[i-2],dp[i-1]);
        }
        return dp[end];
    }
};
上一篇:tomcat启动报错


下一篇:做个标记