动态规划IV (118、119、198、213、337)

news2024/11/17 23:55:38

CP118 杨辉三角

题目描述:

给定一个非负整数 numRows生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。

学习记录:

思想就是没有思想,的杨辉三角,但是注意resize的用法和初始化的方法!

//题解
class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> ret(numRows);
        for (int i = 0; i < numRows; ++i) {
            ret[i].resize(i + 1);
            ret[i][0] = ret[i][i] = 1;
            for (int j = 1; j < i; ++j) {
                ret[i][j] = ret[i - 1][j] + ret[i - 1][j - 1];
            }
        }
        return ret;
    }
};

CP119 杨辉三角II

题目描述:

给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。

学习记录:

由于刚刚那个没写,这个就写了一下,如果按第一种方法直接开个二维数组是OK的,然后就想肯定是可以用一维的,但是如果从后往前遍历就存在问题,例如1 2 1,要计算1+2,2+1,,那么1+2要存在第二个位置的话,计算2+1就没办法计算了,中间的2就无了。但是反向遍历却是OK的,还考虑1 2 1,倒着来,先计算2+1存在第三个位置,此时第二个位置的2还是有的,可以把1+2存在第二个位置,能很好的计算!

class Solution {
public:
    vector<int> getRow(int rowIndex) {

        vector<int> result(rowIndex+1);
        result[0]=1;

        if(rowIndex==0) return result;

        for(int i=1;i<=rowIndex;i++)
        {
            result[i]=1;
            for(int j=i-1;j>0;j--)
            {
                result[j]=result[j-1]+result[j];
            }
        }
        return result;
    }
};

CP198 打家劫舍

题目描述:

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

学习记录:

第一个想法就是,每个房子有两种选择,偷或者不偷,用两个变量来记录,然后这间偷=上一间不偷+这间偷,但是显然存在一个问题,可以连续两个房子不偷的,所以肯定是解答错误的。

class Solution {
public:
    int rob(vector<int>& nums) {
        int length=nums.size();
        int t=nums[0];int f=0;
        for(int i=1;i<length;i++)
        {
            int temp=t;
            t=f+nums[i];
            f=temp;
        }
        return t>f ? t : f;
    }
};

然后的想法是,每间房子有两种选择,偷或者不偷,用两个变量来记录,记录的是,这间偷或者不偷情况下能获得最多的钱,前面已经说了,少考虑了情况,也就是说状态转移方程会发生改变。

注意:由于非负,所以不断后移的情况下,每间偷和不偷一定都是在增加的

这间偷=max(上一间不偷+这间的钱,上一间偷);

这间不偷=max(上一间不偷,上一天偷);

class Solution {
public:
    int rob(vector<int>& nums) {
        int length=nums.size();

        int t=nums[0];//偷
        int f=0;//不偷
        for(int i=1;i<length;i++)
        {
            int temp=t;//临时存一下昨天偷的值
            t=max(t,f+nums[i]);
            f=max(temp,f);
        }
        
        return t>f ? t : f;
    }
};

虽然写出来了,但是去看了一下题解,还是想复杂了,只需要记录到每间后的最大金额就行,无论这间你选择偷不偷都行,只记录最大就行。然后数组也可以变成三个存储空间

看了这个后其实有个移位,如果偷第k间屋子,用的是dp[i-2]+nums[i],但是如果在dp[i-1]的地方选择的是不偷,为什么不用dp[i-1]呢?思考:如果i-1偷达到最大,那么就应该用i-2的最大来加这个是毫无疑问的;如果i-1在不偷的时候达到最大,说明一定是之前的一个组合使得结果最大,那么这个最大在i-2也是可以达到的,也就是说如果i-1不偷,那必然存在dp[i-1]=dp[i-2],所以综合两种情况,在偷i的时候用i-2处的最大值就行了,避免我们判断i-1处是否偷。

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

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/house-robber/solution/da-jia-jie-she-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

CP213 打家劫舍II

题目描述:

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

学习记录:

刮大风,下大雨,8级雷暴,只想睡觉,脑子一片空白

但是为什么第一间和最后一间一定要选一间?思考连续的两间是否必偷一间,答案是不一定的,13131,首尾就都不偷,但是这对我们截断没有影响,也就是说,不是第一间和最后一间都要偷,但是这两间中最多只能偷一间,所以我们可以截成两个部分去思考。

class Solution {
public:
    int robRange(vector<int>& nums, int start, int end) {
        int first = nums[start], second = max(nums[start], nums[start + 1]);
        for (int i = start + 2; i <= end; i++) {
            int temp = second;
            second = max(first + nums[i], second);
            first = temp;
        }
        return second;
    }

    int rob(vector<int>& nums) {
        int length = nums.size();
        if (length == 1) {
            return nums[0];
        } else if (length == 2) {
            return max(nums[0], nums[1]);
        }
        return max(robRange(nums, 0, length - 2), robRange(nums, 1, length - 1));
    }
};

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/house-robber-ii/solution/da-jia-jie-she-ii-by-leetcode-solution-bwja/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

CP337 打家劫舍III

题目描述:

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。

学习记录:不会

class Solution {
public:
    unordered_map <TreeNode*, int> f, g;

    void dfs(TreeNode* node) {
        if (!node) {
            return;
        }
        dfs(node->left);
        dfs(node->right);
        f[node] = node->val + g[node->left] + g[node->right];
        g[node] = max(f[node->left], g[node->left]) + max(f[node->right], g[node->right]);
    }

    int rob(TreeNode* root) {
        dfs(root);
        return max(f[root], g[root]);
    }
};

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/house-robber-iii/solution/da-jia-jie-she-iii-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

改进为:

struct SubtreeStatus {
    int selected;
    int notSelected;
};

class Solution {
public:
    SubtreeStatus dfs(TreeNode* node) {
        if (!node) {
            return {0, 0};
        }
        auto l = dfs(node->left);
        auto r = dfs(node->right);
        int selected = node->val + l.notSelected + r.notSelected;
        int notSelected = max(l.selected, l.notSelected) + max(r.selected, r.notSelected);
        return {selected, notSelected};
    }

    int rob(TreeNode* root) {
        auto rootStatus = dfs(root);
        return max(rootStatus.selected, rootStatus.notSelected);
    }
};

还是状态的选择,但是这个也用到分治的思想,变成叶节点,但是注意就是之前我们是用i来索引的,但是这里我们有的是指针,也就是说我们需要找到指针和数字的对应,也就是说hash表!!代码还是比较好理解的,但是还是学习很多。1.状态的选择,2.指针和数字的对应

PS:我这个小菜鸟居然开始有funs了,虽然都是通过用户推荐关注的,但是还是觉得很欣慰,但是UP自己写是为了自己学习,很多题解是copy的官网题解和大佬的,不是抄袭,自留学习用,不妥请私信删除,非常抱歉,感谢大家的理解!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/654728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AUTOSAR MCAL之SPI(Specification of SPI Handler/Driver)

本文将详细介绍AUTOSAR MCAL SPI模块的知识点及注意事项&#xff0c;本模块的配置会在其他文章进行分享。本文大部分内容来源于标准&#xff0c;并参照了NXP S32K1系列的 MCAL SPI的代码。 耐心看完本文后&#xff0c;你就对AUTOSAR MCAL SPI有了非常深入的了解。 目录 1. 模…

在githhub上创建个人主页的方法【2023更新版】

01-进入github的网站&#xff0c;链接 https://github.com/ &#xff0c;然后注册&#xff0c;登陆&#xff0c;注意登陆时设置的用户名(username)就是将来你个人主页的三级域名&#xff0c;所以这里一定要慎重填写username。如下图所示&#xff1a; 02-注册完成后进入个人主…

【备战秋招】每日一题:5月13日美团春招第四题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检&#xff0c;为了更好的阅读体检&#xff0c;&#xff0c;可以查看我的算法学习博客第四题-沙堡 在线评测链接:P1289 题目描述 塔子哥在海边建了一个沙堡乐园。 里面有一个巨大的沙堡&#xff0c;塔子哥每年都会增加这个沙堡的层数&#xff0c;但也有一定…

Found a swap file by the name “.credentials.swp“

问题 使用vim终端编辑一个文件的时候&#xff0c;遇到了一个提示&#xff1a;Found a swap file by the name ".credentials.swp" 解决 这是由于编辑文件意外退出导致的&#xff0c;产生了.swp文件,这个时候&#xff0c;只要按下键盘【A】键 然后&#xff0c;使用…

Easy_Trans轻松让你的项目减少30%SQL代码量

什么是Easy_Trans Easy Trans是一款用于做数据翻译的代码辅助插件&#xff0c;利用MyBatis Plus/JPA/BeetlSQL 等ORM框架的能力自动查表&#xff0c;让开发者可以快速的把ID/字典码 翻译为前端需要展示的数据。 easy trans的优点 功能多样 缓存支持 跨微服务翻译支持(User和…

蓝奥声核心技术分享 ——无线单火控制技术

1.技术背景 无线单火控制技术指基于对目标场景状态变化的协同感知而获得触发响应并进行智能决策&#xff0c;属于蓝奥声核心技术--边缘协同感知(EICS&#xff09;技术的关键支撑性技术之一。该项技术属于物联网边缘域的无线通信与智能控制技术领域。 对于不同智能应用场景&am…

安庆师范大学之计科-数据结构MOOC期末考试

单选 5分/题&#xff0c;共30题 1、在长度为n的顺序表的第i个位置上插入一个元素&#xff0c;i的合理取值范围是&#xff08; &#xff09;。 A.1≤i≤n B.任意正整数 C.i≥0 D.1≤i≤n1 正确答案&#xff1a;D 2‏、已知L是带表头结点单链表的头指针&#xff0c;摘除…

kubernetes operator解析

您是否想过站点可靠性工程 (SRE) 团队如何有效地成功管理复杂的应用程序&#xff1f; 在 Kubernetes 生态中&#xff0c;只有一个答案&#xff1a;Kubernetes Operators&#xff01; 在本文中&#xff0c;我们将研究它们是什么以及它们是如何工作的。 Kubernetes Operator 概念…

STM32 软件模拟SPI

STM32 软件模拟SPI 前言关于 SPISPI 协议软件模拟实现Driver_SPI.hDriver_SPI.c 前言 STM32库&#xff1a;标准函数库 测试环境&#xff1a;STM32F103系列 关于 SPI SPI 协议 SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外设接口&#xff09;是由摩托罗拉…

Python ChatGPT API 新增的函数调用功能演示

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 OpenAI 重磅更新&#xff0c;API 添加函数调用能力&#xff0c;能处理更长上下文&#xff0c;价格又有所降低 … 知乎讨论&#xff1a;https://www.zh…

【超详细教学】Python制作迷宫小游戏教程

文章目录 前言1.首先确定迷宫的大小2. 定义迷宫的墙壁和通道3.定义迷宫的起点和终点4.定义迷宫的方向5. 生成一个空的迷宫6. 在迷宫中随机选择一个起点和终点7. 在迷宫中随机选择一个方向8. 检查一个位置是否在迷宫内9. 检查一个位置是否是墙壁10. 检查一个位置是否是通道11. 检…

工程师卓越之旅:技术文档怎么写

0.意义和价值 当前信息共享长期技术知识传承加深作者的理解和思考交付包括代码和技术文档 1.准备阶段 明确文档需求、受众和内容范围 2.调研阶段 对比有代表性的同类或相似的技术文档&#xff0c;建立大致框架收集相关信息&#xff0c;分析验证进行技术决策在文档中将每个…

HttpServletRequest对象中获取客户端IP地址

什么是HttpServletRequest对象 HttpServletRequest对象是Java Servlet规范中定义的一种接口&#xff0c;它封装了客户端请求的所有信息&#xff0c;例如请求头、请求参数、请求方法、请求URL等。在Java Web开发中&#xff0c;HttpServletRequest对象非常常用&#xff0c;可以用…

关于Java SSM框架的面试题

一、Spring面试题 1、Spring 在ssm中起什么作用&#xff1f; Spring&#xff1a;轻量级框架作用&#xff1a;Bean工厂&#xff0c;用来管理Bean的生命周期和框架集成。两大核心&#xff1a;1、IOC/DI(控制反转/依赖注入) &#xff1a;把dao依赖注入到service层&#xff0c;se…

程序替换原理

文章目录 一、程序替换 一、程序替换 程序替换用于将当前进程的用户空间的代码和数据全部替换为新程序的代码和数据&#xff0c;程序替换不会创建新进程&#xff0c;而是用当前进程执行新程序的代码&#xff0c;fork 创建子进程后&#xff0c;子进程默认执行的是父进程的代码&…

信创-大数据平台CPU架构支持

一、CDH和HDP、CDP CDP数据中心类似于CDH和HDP,直接安装在硬件服务器上,目前支持市面上主流的X86服务器,包括国内海光服务器&#xff0c; CDH不支持ARM 以上两种大数据平台都仅支持x86架构&#xff0c;早在几年期RedHat联手cloudera公司发表声明将推出64位ARM版&#xff0c;据…

【备战秋招】每日一题:4月29日美团春招第一题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检&#xff0c;为了更好的阅读体检&#xff0c;&#xff0c;可以查看我的算法学习博客第一题-选修课 在线评测链接:P1266 题目内容 某大学一共有 n 门课程&#xff0c;编号为 1 ~ n &#xff0c; m 个学院&#xff0c;编号为1 ~ m 。最近开学季&#xff0c;…

剑指 Offer 53 - II: 0~n-1中缺失的数字

看到这道题的第一反应就是二分查找&#xff0c;由于是递增的所以二分查找所需的时间很短 &#xff0c;设置一个左&#xff0c;一个右&#xff0c;一个中间&#xff0c;如果判断吧不同需要想下前面是否一样&#xff0c;如果是那么就找到&#xff0c;不是再继续二分查找。 我的思…

【redis】redis的5种数据结构及其底层实现原理

文章目录 redis中的数据结构redis数据结构底层实现stringlisthashsetintset字典 zset跳表插入删除过程 redis中的数据结构 Redis支持五种数据类型&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;…

小波变换之pycwt (python)

小波变换之pycwt PyCWT是用于连续小波谱分析的Python模块&#xff0c;它包括小波变换和FFT算法统计分析的常规操作的集合。此外&#xff0c;该模块还包括交叉小波变换、小波相干性测试和样例脚本。 该模块需要NumPy和SciPy&#xff0c;matplotlib模块。 pip安装&#xff1a;…