从零备战蓝桥杯——动态规划(递推篇)

news/2024/5/18 20:10:15/文章来源:https://blog.csdn.net/m0_63830846/article/details/127309516

双非刷leetcode备战2023年蓝桥杯,qwq加油吧,无论结果如何总会有收获!一起加油,我是跟着英雄哥的那个思维导图刷leetcode的,大家也可以看看所有涉及到的题目用leetcode搜索就可以哦,因为避让添加外链,一起加油!!!

动态规划将分为五个板块来讲,本篇为基础dp篇都是基础题目适合入门
请添加图片描述


文章目录

  • 基础篇:
  • Leetcode相关题目
    • 基础dp:
      • 各种递推题目
      • 二维递推:62. 不同路径
      • 二维递推:63. 不同路径
      • 343. 整数拆分
      • 96. 不同的二叉搜索树
      • 卡塔兰数catalan


基础篇:

不会吧不会吧,你连dp的基础都不会,我不信我不信,反正我会(!我也不会,略懂一点点),这是一种思想吧,如果不会的话可以看我这几篇博文,一个是八皇后的,一个是递推的,我就不添加链接了哈,直接点头像就能看~话不多说你要是看完了咱就直接开始刷题 ,这其实就是一种思想,我认为直接刷题就可以了~所以咱直接刷题哈,因为题目会告诉咱啥叫动态规划~
三步走

  • 初始数据
  • dp公式
  • 循环求值

当然不是所有的dp问题都这么简单


Leetcode相关题目

基础dp:

各种递推题目

如:509,70,746.各位可以刷刷

二维递推:62. 不同路径

思路:不会的看我的博文:4000字,让你明白递推及其例题做法(C语言,有图)点头像就有哈,里面有个马兰过河卒问题,一模一样的(没障碍这个)

class Solution {
public:int uniquePaths(int m, int n) {int a[m+1][n+1];for(int i=1;i<=m;i++){a[i][1]=1;}for(int i=1;i<=n;i++){a[1][i]=1;}//初始化for(int i=2;i<=m;i++){for(int j=2;j<=n;j++){a[i][j]=a[i-1][j]+a[i][j-1];}}return a[m][n];}
};

二维递推:63. 不同路径

思路:不会的看我的博文:4000字,让你明白递推及其例题做法(C语言,有图)点头像就有哈,里面有个马兰过河卒问题,一模一样的

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int n = obstacleGrid.size(), m = obstacleGrid.at(0).size();vector <int> f(m);f[0] = (obstacleGrid[0][0] == 0);for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (obstacleGrid[i][j] == 1) {f[j] = 0;continue;}if (j - 1 >= 0 && obstacleGrid[i][j - 1] == 0) {f[j] += f[j - 1];}}}return f.back();}
};

343. 整数拆分

思路:

class Solution {
public:
int integerBreak(int n) {return (vector<int>{ -1, -1, 1, 2, 4, 6, 9, 12, 18, 27, 36, 54, 81, 108, 162, 243, 324, 486, 729, 972, 1458, 2187, 2916, 4374, 6561, 8748, 13122, 19683, 26244, 39366, 59049, 78732, 118098, 177147, 236196, 354294, 531441, 708588, 1062882, 1594323, 2125764, 3188646, 4782969, 6377292, 9565938, 14348907, 19131876, 28697814, 43046721, 57395628, 86093442, 129140163, 172186884, 258280326, 387420489, 516560652, 774840978, 1162261467, 1549681956  })[n];
}
};

开个玩笑,下面是正八经的思路了:

  • 首先dp[i]表示的就是最大的乘积;
  • dp公式就是: dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));
    • 这个咱dp[i]不就是乘积嘛,用这个乘积和 max((i - j) * j, dp[i - j] * j)作比较看看那个大哪个就是dp,那你就问了这个是啥,凭啥能表示
      • 将 i 拆分成 j 和 i-j 的和,且 i-j 不再拆分成多个正整数,此时的乘积是(i - j) * j
      • 将 i 拆分成 j 和 i-j 的和,且 i-j 继续拆分成多个正整数,此时的乘积是dp[i - j] * j
        怎么拆呢,答案就是用j拆,j可能从1到i-1的任何一个数用j来吧i拆成两个数j和i-j。要是还能拆就是j和dp[i-j];因为dp[i-j]肯定是i-j这个点最大的值,所以可以用dp[i-j]来表示这个是拆成多个时候的最大值,当然最大值×肯定是最大的。
        所以就做完了~!
class Solution {
public:int integerBreak(int n) {vector<int> dp(n+1);dp[2] = 1;for (int i = 3; i <= n ; i++) {for (int j = 1; j < i - 1; j++) {dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));}}return dp[n];}
};

96. 不同的二叉搜索树

咱讲真,dp的题目看完答案好简单不看答案啥也不会,真服了
初始值:dp[0]=1;dp[1]=1;
循环:
首先1~n中都可以做根节点, for (int i = 2; i <= n; i++)来表示让哪个作为根节点

如果令t为根节点的话那1 ~ t 就会作为左子树(树小)而t ~n个数就作为右子树了(数大)
那首先我们可以fo循环一下让1到n分别为根节点那dp(j-1)*dp(n-j)就是这个节点的个数了
在t点左子树可能有多少种情况?

  • 左 1 右 t-1。
  • 左 2 右 t-2。
  • 左t-1 右 1。

可以看出规律左边的是逐渐递增的怎么表示呢当然是循环了 for (int j = 1; j <= i;j++)

然后 G[i] += G[j - 1] * G[i - j];就可以表示这个为根时的搜索树有多少种结果

class Solution {
public:int numTrees(int n) {vector<int> G(n + 1);G[0] = 1;G[1] = 1;for (int i = 2; i <= n; i++) {for (int j = 1; j <= i;j++) {G[i] += G[j - 1] * G[i - j];}}return G[n];}
};

卡塔兰数catalan

然后由这个结果我们可以得到一个公式
事实上我们在方法一中推导出的 G(n)函数的值在数学上被称为卡塔兰数
​卡塔兰数更便于计算的定义如下
在这里插入图片描述
然后这个题就可以这么做

class Solution {
public:int numTrees(int n) {long long C = 1;for (int i = 0; i < n; ++i) {C = C * 2 * (2 * i + 1) / (i + 2);}return (int)C;}
};

这个数还能解决什么问题呢?
在这里插入图片描述
复制的百度哈


​​在这里插入图片描述

Love is worth years.❤
热爱可抵岁月漫长。

​​​​
本文部分思路来源于网络如有侵权联系删除~

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简历石沉大海?来围观月薪 20k 的软件测试工程师真实简历...

​前言&#xff1a;面试的重要性 在互联网公司&#xff0c;你面试的时候能拿到多少 k 薪资&#xff0c;基本上决定了你未来 1-2 年的工资&#xff0c;这个非常现实。软件测试工程师在企业中俩内年想涨工资非常难的&#xff0c;就算有涨&#xff0c;涨幅也不大。当然不排除你待…

前置句与倒装句练习题

1. 特殊语序&#xff1a;前置 1.All the information you need I am putting in the post today. 2.Any item in our catelogue we can supply and deliver 3.How she got the gun through customs they never found out. 4.The kitchen we are planning to redecorate in the…

Day25Linux获取命令帮助,压缩与解压缩,vim编辑器使用,Linux系统下载软件,通过yum方式安装软件

命令字的帮助信息的查询 rm -fr fdisk -l ls ls -l ls -出现许多.开头的文件隐藏文件 Linux命令字格式 命令字 [选项] 命令字 [选项] 文件或目录 ls哪些选项&#xff1f; 1.如何查看一个命令字的帮助手册&#xff1f; man man ls 按q退出 ls -a显示隐藏文件 ls -l显示文件的详…

Chap4 循环结构 学习总结 第五小组

1、为什么需要循环?: 在 c语言中需要重复执行某些操作时,需要用到循环结构 2、循环的三个语句: for循环、while循环、do-while循环。 下列是while循环和for循环的流程图3、三种循环语句的表达式: (1)while(进入循环条件)循环体语句; (2)do {循环体语句;}while(进…

LVS负载均衡—DR模式

内容预知 1.DR模式的特点 2.LVS-DR中的ARP问题 2.1 问题一&#xff1a;VIP地址相同导致响应冲突 问题原因&#xff1a; 解决方法&#xff1a; 2.2 问题二&#xff1a;返回报文时源地址使用VIP&#xff0c;导致网关设备的ARP缓存表紊乱 问题原因&#xff1a; 解决方法&…

GitHub爆火,一份从零到1「架构师成长手册」,原来成为架构师也有捷径

架构师】我想应该没有哪个程序员会陌生了吧&#xff0c;作为一个程序员技术追求的里程碑&#xff0c;有多少程序员想转型架构师而不得门路&#xff0c;其实架构师比较抽象的拆解能力就两方面技术项目足够的技术栈深度和广度再加上足够的项目经验其实是完全可以驾驭架构师的岗位…

QFramework v1.0 使用指南 架构篇:05. 引入 Utility

05. 引入 Utility 在这一篇&#xff0c;我们来支持 CounterApp 的存储功能。 其代码也非常简单&#xff0c;只需要修改一部分 Model 的代码即可&#xff0c;如下&#xff1a; // 定义一个 Model 对象public class CounterAppModel : AbstractModel{private int mCount;public…

爬虫学习(01):了解爬虫超文本传输协议的理解

一、爬虫入门二、web请求过程(百度为例)2.1 页面渲染1. 服务器渲染 -> 数据直接在页面源代码里能搜到2. 前端JS渲染 -> 数据在页面源代码里搜不到三、浏览器工具的使用(重点)1. Elements2. Console3. Source4. Network四、超文本传输协议请求:响应:https协议加密方法(三种…

常见的网络安全风险有哪些?

常见的网络安全风险&#xff1a; 1、勒索软件 勒索软件(Ransomware&#xff0c;又称勒索病毒)是一种恶意软件&#xff0c;它的工作方式基本与计算机病毒类似&#xff0c;不过跟一般的计算机病毒不同&#xff0c;它们不会直接地破坏数据&#xff0c;而是将数据进行加密锁定&am…

搭建云上博客

安装apache: yum -y install httpd mod_ssl mod_perl mod_auth_mysql httpd -v systemctl start httpd.service Firefox ESR浏览器的址栏中&#xff0c;访问http://ECS公网地址。 安装MariaDB数据库: yum install -y mariadb-server systemctl start mariadb systemctl …

Day33、JavaScript

1、JavaScript 1.1、JavaScript组成 1.2、什么是ECMAScript 1&#xff09;ECMAScript是一种语法标准 语法、变量和数据类型、运算符、逻辑控制语句、关键字、保留字、对象 2&#xff09;编码遵循ECMAScript标准 1.3、什么是BOM 1&#xff09;BOM&#xff1a;Browser Object Mod…

leetcode 474一和零

一和零 动态规划&#xff08;01背包&#xff0c;三级数组&#xff09; 和经典的背包问题只有一种容量不同&#xff0c;这道题有两种容量&#xff0c;即选取的字符串子集中的 0 和 1 的数量上限。 经典的背包问题可以使用二维动态规划求解&#xff0c;两个维度分别是物品和容量…

DataFrame简介

dataframe是什么 DataFrame实质上是存储在不同节点计算机中的一张关系型数据表。分布式存储最大的好处是&#xff1a;可以让数据在不同的工作节点上并行存储&#xff0c;以便在需要数据的时候并行运算。 dataframe与RDD的关系 RDD是一种分布式弹性数据集&#xff0c;将数据分…

高项 案例分析重点知识 人力资源沟通干系人

七、人力资源管理 人力资源管理常见考点&#xff1a; 一、人力资源重要知识点&#xff08;人力资源管理计划、成功团队的特征、项目经理要求、权利的分类、激励理论等&#xff09; 二、人力资源常见问题及答题要点&#xff08;管理风格、领导关系、人员责职、项目经理任命、…

SAP LTO1创建转储 L_TO_CREATE_MULTIPLE 及前台操作

目录 LT01 转储前台操作 用L_TO_CREATE_MULTIPLE做转储 数据的传参 TRY-CATCH 异常捕获 代码展示 LT01 转储前台操作 首先输入T-CODE LT01 进入一下界面 如图所示输入必输项(数据用自个的) 然后回车 回车后会进入下面的界面输入从.......到目的地的数据,数量也要输 然…

保姆教程系列一:国产数据库达梦安装教程(DM)

系列文章目录 保姆教程系列一、国产达梦数据库安装教程 保姆教程系列二、国产数据库达梦无缝迁移 保姆教程系列三、国产数据库整合Spring boot 文章目录系列文章目录前言简介一、准备工作1.1 检查docker版本1.2 获取镜像二、运行初始化2.1 运行并初始化容器2.2 容器运行失败异常…

MPNet: Masked and Permuted Pre-training for Language Understanding(2020-4-20)

模型介绍 BERT采用掩模语言建模(MLM)进行预训练&#xff0c;是最成功的预训练模型之一。由于BERT忽略了预测的 token 之间的依赖关系&#xff0c;XLNet引入了排列语言建模(PLM)进行预训练&#xff0c;以解决这个问题。然而&#xff0c;XLNet并没有利用一个句子的全部位置信息&…

Windows系统历史版本简介

思考&#xff1a;30年间Windows系统有哪些版本呢&#xff1f; 木易巷带你了解~ 前言 跟我一起&#xff0c;穿越时间&#xff01; 你在使用什么操作系统&#xff0c;是Windows还是MacOS还是Linux? 一、Windows 1.0 1985年11月20日&#xff0c;微软推出了历史上第一款视窗操…

orin+96712接GMSL2相机调试经验

文章目录 1. 9295端2. 96712端a. Link lock状态Link ALink BLink CLink Db. VID PIPELINE LOCK状态c.video有效数据d. GMSL2及LINK EN 状态e.CSIPLL 状态1. 9295端 如下4个寄存器,确认相机pclk_DET状态,其中正常值是有⼀路值是0x8a。 (VID_TX X)0x102 (VID_TX Y)0x10A (V…

看了这篇Java 泛型通关指南,再也不怵满屏尖括号了

在前面介绍 Java 集合框架里的各种容器的时候&#xff0c;我们已经接触到泛型了&#xff0c;那时我们对泛型的简单理解是&#xff0c;类似这样 ArrayList 声明一个 ArrayList 实例&#xff0c;就给它做了个类型限制&#xff0c;让能让它其中只能放入 String 类型的元素。泛型在…