算法训练营第三十六天(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]);
    }
};
相关推荐
怀旧,2 分钟前
【数据结构】6. 时间与空间复杂度
java·数据结构·算法
积极向上的向日葵15 分钟前
有效的括号题解
数据结构·算法·
GIS小天21 分钟前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月7日第101弹
人工智能·算法·机器学习·彩票
_Itachi__42 分钟前
LeetCode 热题 100 74. 搜索二维矩阵
算法·leetcode·矩阵
不忘不弃43 分钟前
计算矩阵A和B的乘积
线性代数·算法·矩阵
不爱写代码的玉子1 小时前
HALCON透视矩阵
人工智能·深度学习·线性代数·算法·计算机视觉·矩阵·c#
Java 技术轻分享1 小时前
《树数据结构解析:核心概念、类型特性、应用场景及选择策略》
数据结构·算法·二叉树··都差速
芜湖xin1 小时前
【题解-洛谷】P1706 全排列问题
算法·dfs
曦月逸霜3 小时前
第34次CCF-CSP认证真题解析(目标300分做法)
数据结构·c++·算法