算法训练营第三十六天(8.26)| 动态规划Part07:完全背包

目录

[Leecode 198.打家劫舍](#Leecode 198.打家劫舍)

[Leecode 213.打家劫舍 II](#Leecode 213.打家劫舍 II)

[Leecode 337.打家劫舍III](#Leecode 337.打家劫舍III)


Leecode 198.打家劫舍

题目地址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目类型:打家劫舍

cpp 复制代码
class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        if (n == 1) return nums[0];
        if (n == 2) return max(nums[0], nums[1]);
        // dp[i]代表前i家所能打劫到的最大数目
        vector<int> dp(n, 0);
        dp[0] = nums[0];
        dp[1] = max(nums[0], nums[1]);
        // dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
        for (int i = 2; i < n; ++i) {
            dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
        }
        return dp[n - 1];
    }
};

Leecode 213.打家劫舍 II

题目地址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目类型:打家劫舍

思路:与普通打家劫舍的区别是,首尾不能同时取,所以

cpp 复制代码
class Solution {
private:
    int rob1(vector<int>& nums) {
        int n = nums.size();
        if (n == 1) return nums[0];
        if (n == 2) return max(nums[0], nums[1]);
        // dp[i]代表前i家所能打劫到的最大数目
        vector<int> dp(n, 0);
        dp[0] = nums[0];
        dp[1] = max(nums[0], nums[1]);
        // dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
        for (int i = 2; i < n; ++i) {
            dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
        }
        return dp[n - 1];
    }
public:
    int rob(vector<int>& nums) {
        if (nums.size() == 1) return nums[0];
        vector nums1(nums.begin(), nums.end() - 1);
        vector nums2(nums.begin() + 1, nums.end());
        return max(rob1(nums1), rob1(nums2));
    }
};

Leecode 337.打家劫舍III

题目地址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目类型:打家劫舍

cpp 复制代码
class Solution {
private:
    // 返回的数组即为dp数组,一共连个元素:[偷当前节点获得的最大收益,不偷当前节点获得的最大收益]
    vector<int> robTree(TreeNode* root) {
        if (!root) return {0, 0};
        vector nums1 = robTree(root->left);
        vector nums2 = robTree(root->right);
        // 不取当前节点
        int val1 = max(nums1[0], nums1[1]) + max(nums2[0], nums2[1]);
        // 取当前节点
        int val2 = root->val + nums1[0] + nums2[0];
        return {val1, val2};
    } 
public:
    int rob(TreeNode* root) {
        vector<int> nums = robTree(root);
        return max(nums[0], nums[1]);
    }
};
相关推荐
Dontla1 分钟前
Rust泛型系统类型推导原理(Rust类型推导、泛型类型推导、泛型推导)为什么在某些情况必须手动添加泛型特征约束?(泛型trait约束)
开发语言·算法·rust
Ttang237 分钟前
Leetcode:118. 杨辉三角——Java数学法求解
算法·leetcode
喜欢打篮球的普通人8 分钟前
rust模式和匹配
java·算法·rust
java小吕布21 分钟前
Java中的排序算法:探索与比较
java·后端·算法·排序算法
杜若南星1 小时前
保研考研机试攻略(满分篇):第二章——满分之路上(1)
数据结构·c++·经验分享·笔记·考研·算法·贪心算法
路遇晚风1 小时前
力扣=Mysql-3322- 英超积分榜排名 III(中等)
mysql·算法·leetcode·职场和发展
Neophyte06081 小时前
C++算法练习-day40——617.合并二叉树
开发语言·c++·算法
木向1 小时前
leetcode104:二叉树的最大深度
算法·leetcode
一个不喜欢and不会代码的码农1 小时前
力扣113:路径总和II
算法·leetcode