算法训练营第三十六天(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]);
    }
};
相关推荐
少许极端31 分钟前
算法奇妙屋(五)-链表
数据结构·算法·链表
XISHI_TIANLAN1 小时前
【多模态学习】Q&A6: 什么是MOE架构?Router Z Loss函数是指什么?负载均衡损失(Load Balancing Loss)又是什么?
学习·算法·语言模型
木子.李3471 小时前
数据结构-算法C++(额外问题汇总)
数据结构·c++·算法
花心蝴蝶.1 小时前
API签名认证算法全解析
算法
兮山与1 小时前
算法6.0
算法
代码对我眨眼睛1 小时前
739. 每日温度 LeetCode 热题 HOT 100
算法·leetcode
程序员莫小特2 小时前
老题新解|计算2的N次方
开发语言·数据结构·算法·青少年编程·信息学奥赛一本通
wearegogog1233 小时前
基于块匹配的MATLAB视频去抖动算法
算法·matlab·音视频
十重幻想4 小时前
PTA6-1 使用函数求最大公约数(C)
c语言·数据结构·算法
大千AI助手5 小时前
蛙跳积分法:分子动力学模拟中的高效数值积分技术
算法·积分·数值积分·蛙跳积分法·牛顿力学系统·verlet积分算法