力扣第39天----第198题、第213题、第337题

力扣第39天----第198题、第213题、第337题

文章目录

一、第198题--打家劫舍

​ 经过前面背包题目的训练,这题挺简单,没啥太多可说的。递推公式,考虑当前点是否采用,分采用、不采用2种思路进行。

c++ 复制代码
class Solution {
public:
    int rob(vector<int>& nums) {
        vector<int> dp(nums.size(), 0);
        dp[0] = nums[0];
        if (nums.size() <2) return nums[0];
        dp[1] = max(nums[0], nums[1]);
        for (int i = 2; i< nums.size(); ++i){
            dp[i] = max(dp[i-1], dp[i-2] + nums[i]);
        }
        return dp[nums.size() - 1];
    }
};

二、第213题--打家劫舍II

​ 环形问题,展开成线性问题,展开成2种线性结构,再分别考虑。

c++ 复制代码
class Solution {
public:
    int rob_linear(vector<int>& nums) {
        vector<int> dp(nums.size(), 0);
        dp[0] = nums[0];
        if (nums.size() <2) return nums[0];
        dp[1] = max(nums[0], nums[1]);
        for (int i = 2; i< nums.size(); ++i){
            dp[i] = max(dp[i-1], dp[i-2] + nums[i]);
        }
        return dp[nums.size() - 1];
    }

    int rob(vector<int>& nums) {
        if (nums.size() == 1) return nums[0];
        vector<int> nums10(nums.begin(), nums.end()-1);
        int line10 = rob_linear(nums10);

        vector<int> nums01(nums.begin()+1, nums.end());
        int line01 = rob_linear(nums01);
        return max(line01, line10);
    }
};

三、第337题--打家劫舍 III

​ 树形dp----没基础的话,不太好做;跟着做下来,基本消化了吧。

​ dp数组----每个节点不采用、采用状态下,得到的金钱;所以,就是个二维数组。

​ 遍历顺序----采用树的遍历方式,这里采用后序遍历。子节点处理完了,才能处理根节点。

​ 初始化----这里与截止条件重合,树遍历终止的时候,就是dp数组初始化的时候,初始化为{0,0},即空节点时价值为0。

​ 递推公式----分采用当前节点、不采用当前节点2种情况分别递推。采用的时候,下一层就不能采用,就是left[0]、right[0],然后再加起来;不采用的时候,下一层就要综合考虑,所以max(left[0], left[1])、max(right[0], right[1]),左右分支都要考虑到,再加一起。

c++ 复制代码
class Solution {
public:
    int rob(TreeNode* root) {
        vector<int> result = robTree(root);
        return max(result[0], result[1]);
    }
    vector<int> robTree(TreeNode* root){    //0表示不采取当前点,1表示采取当前点。
        if (root == nullptr) return vector<int> {0,0};
        vector<int> left = robTree(root->left);
        vector<int> right = robTree(root->right);

        int cur_get = root->val + left[0] + right[0];
        int cur_noget = max(left[0], left[1]) + max(right[0], right[1]);
        return vector<int> {cur_noget, cur_get};
    }
};
相关推荐
hsling松子2 小时前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
dengqingrui1233 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝3 小时前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O3 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
CV-King4 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
代码雕刻家4 小时前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain4 小时前
算法 | 位运算(哈希思想)
算法
Kalika0-06 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
sp_fyf_20246 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
我是哈哈hh8 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝