【动态规划】198. 打家劫舍 213. 打家劫舍 II

【动态规划】198. 打家劫舍 213. 打家劫舍 II

class Solution {
public:
    int rob(vector<int>& nums) {
        int num_len = nums.size();
        if(num_len == 1)
            return nums[0];
        else if(num_len == 2)
            return nums[0] > nums[1] ? nums[0] : nums[1];
        int dp[num_len + 1];
        dp[0] = nums[0];
        dp[1] = nums[0] > nums[1] ? nums[0] : nums[1];
        for(int i=2;i<num_len;++i)
            dp[i] = max(dp[i-2] + nums[i], dp[i-1]);
        return dp[num_len - 1];
    }
};

213. 打家劫舍 II: 所有的房屋都 围成一圈

思路:分类讨论,带头不带尾与带尾不带头;(可以将数组优化去掉,上一题也可以)

class Solution {
public:
    int rob(vector<int>& nums) {
        int num_len = nums.size();
        if(num_len == 1)
            return nums[0];
        if(num_len == 2)
            return max(nums[0], nums[1]);
        if(num_len == 3)
            return max(nums[0], max(nums[1], nums[2]));
        int tmp;
        int num01 = nums[0], num02 = max(nums[1], nums[0]);
        int num11 = 0, num12 = nums[1];
        for(int i=2;i<num_len; ++i){
            if(i != num_len - 1){
                tmp = num02;
                num02 = max(num01 + nums[i], num02);
                num01 = tmp;
            }
            tmp = num12;
            num12 = max(num11 + nums[i], num12);
            num11 = tmp;
            // cout << num02 << " " << num12 << endl;
        }
        return max(num02, num12);
    }
};
posted @ 2022-03-02 10:10  fwx  阅读(51)  评论(0)    收藏  举报