算法训练营第三十六天(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]);
    }
};
相关推荐
CV爱数码几秒前
CT 重建从零开始(五):ASTRA Toolbox 上手——几何、投影器与算法
图像处理·算法·计算机视觉·ct
Rabitebla28 分钟前
【系统性学习笔记】Linux 权限篇(二):文件属性、权限修改与目录权限的底层逻辑
linux·c++·笔记·学习·算法
远离UE440 分钟前
半拉格朗日学习笔记 动力学 实时渲染
人工智能·算法
小郎君6581 小时前
MPTT 不是万能编号:一棵百万节点树的增删改与批量事务
算法
FPGA小徐1 小时前
【一生一芯 / PA】AM 核心文件逐行解析(上):从 start.S 到 gpu.c
前端·算法
lvwangshu1 小时前
P8981 「DROI」Round 1 距离 题解
动态规划·图论·题解·dp·树形dp·技巧·换根dp·性质题·思维好题
Tairitsu_H2 小时前
[动态规划#1] 子数组 | 最大子数组和 | 环形子数组的最大和 | 乘积最大子数组 | 乘积为正数的最长子数组
算法·动态规划
凯瑟琳.奥古斯特2 小时前
动态调优IoU提升OCR文本合并精度
开发语言·python·算法
布莱克6053 小时前
A* 算法详解:从原理到实现
开发语言·c++·算法
段一凡-华北理工大学3 小时前
高炉炼铁机器视觉与智能识别十八讲~系列文章15:可靠性篇:防误报、容错与识别系统的鲁棒性设计
人工智能·算法·机器学习·高炉大模型·高炉机器视觉·高炉炼铁模型开发