【无标题】

198.打家劫舍

class Solution {
public:
    int rob(vector<int>& nums) {
        vector<int> dp(nums.size(),0);
        if (nums.size() == 0) return 0;
        if (nums.size() == 1) return nums[0];//必须有,不然当Nums[0]=0时,dp[1]计算不出来。
        dp[0]=nums[0];
        dp[1]=max(nums[0],nums[1]);
        for(int i=2;i<nums.size();i++){
            dp[i]=max(dp[i-2]+nums[i],dp[i-1]);
        }
        return dp[nums.size()-1];

    }
};

213.打家劫舍II

用上面基础情况的逻辑写成子函数,数组成环,情况一:包含首不包含尾,包含尾不包含首。

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

    }
    int rob(vector<int>& nums) {
        if(nums.size()==0) return 0;
        if(nums.size()==1) return nums[0];        
        int result1 = robRange(nums, 0, nums.size() - 2); // 情况二
        int result2 = robRange(nums, 1, nums.size() - 1); // 情况三
        return max(result1, result2);
    }
};

337.打家劫舍III

后序遍历
这道题目算是树形dp的入门题目,因为是在树上进行状态转移,我们在讲解二叉树的时候说过递归三部曲,那么下面我以递归三部曲为框架,其中融合动规五部曲的内容来进行讲解。

你可能感兴趣的:(算法,leetcode,动态规划)