198. 打家劫舍

这应该又是动态规划题目,在找敢感觉了,f(x)=max(f(x-1),f(x-2)+num[i]),其实在写的时候想到状态方程跨越四个元素

但是想想,先写写看吧,毕竟能运行就好,果然

下面代码加上一句

 a[1] = max(nums[0],nums[1]);便正确了,哈哈哈
 

查看代码

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

于是考虑四个吧

查看代码

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

 

posted @ 2021-12-16 19:10  jozon  阅读(29)  评论(0)    收藏  举报