代码随想录第四十八天|打家劫舍系列,天才级的动归与DFS缝合题目

Leetcode198.打家劫舍

题目链接:Leetcode198.打家劫舍
太简单了也

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

Leetcode213.打家劫舍II

题目链接:Leetcode213.打家劫舍II

二刷提醒

class Solution {
    
    
private:
    int noob(vector<int>& nums,int start,int end){
    
    
        if (end==start) return nums[start];
        vector<int> dp(nums.size());
        dp[start]=nums[start];
        dp[start+1]=max(nums[start],nums[start+1]);
        for (int i=start+2;i<=end;i++) {
    
    
            dp[i]=max(dp[i-2]+nums[i],dp[i-1]);
        }
        return dp[end];
    }
public:
    int rob(vector<int>& nums) {
    
    
        if(nums.size()==1) return nums[0];
        int head=noob(nums,0,nums.size()-2);
        int tail=noob(nums,1,nums.size()-1);
        return max(head,tail);
    }
};

Leetcode337.打家劫舍III

题目链接:Leetcode337.打家劫舍III
这道题真的无敌,把DFS和动归完美缝合在一起了,出这道题的人是个天才。可惜我不是

二刷提醒

class Solution {
    
    
private:
    vector<int> backtracking(TreeNode* cur){
    
    
        if(cur==NULL) return {
    
    0,0};
        vector<int> left=backtracking(cur->left);
        vector<int> right=backtracking(cur->right);
        //偷,存在【0】
        int val0=cur->val+left[1]+right[1];
        //不偷,存在【1】
        int val1=max(left[0],left[1])+max(right[0],right[1]);
        return {
    
    val0,val1};
    }
public:
    int rob(TreeNode* root) {
    
    
        vector<int> res=backtracking(root);
        return max(res[0],res[1]);
    }
};

猜你喜欢

转载自blog.csdn.net/muzi_taibai/article/details/129658862