动态规划<一>初识动态规划
目录
认识动态规划
LeetCodeOJ练习
斐波那契数列模型
认识动态规划
1.动态规划是一种用于解决优化问题的算法策略。
2.它的核心原理是把一个复杂的问题分解为一系列相互关联的子问题。通过先求解子问题,并且记录这些子问题的解(通常用一个表格之类的存储结构),避免重复计算,然后基于这些子问题的解来构建原问题的解
3.解题步骤
这里通过一道题进行说明一些概念
传送门:LeetCode<1137> 第 N 个泰波那契数
1.创建一个dp表(一般用数组)
2.确定状态表示
状态表示的话,简单理解就是dp表里面的值所代表的含义
对于此题的话,就是dp[i]表示的含义为第i个泰波那契数
该如何确定状态表示:
(1)可以根据题目要求,对于本题就是
(2)经验和题目要求
(3)分析问题的过程中,发现重复子问题
3.确定状态转移方程
简单说就是求出dp[i]等于什么 对于本题就是dp[i]=dp[i-1]+dp[i-2]+dp[i-3]
4.初始化
确定初始状态的值,保证填表时不发生越界
对于此题就是dp[0],dp[1],dp[2]必须初始化,若通过状态转移方程计算的话,就会发生越界
5.填表顺序
确定是从左向右,还是从右向左的顺序填表,确保填写当前状态的时候,所需要的状态已经计算过了,对于本题就是从左向右的顺序
6.返回结果
根据题目要求和具体的状态表示,对于此题就是返回dp[n]
7.空间优化(不是必须)
因为创建dp表,导致空间复杂度为O(N),在这里我们可以用滚动数组进行优化
通过几个变量来降低空间复杂度
当我们依次往后求dp[i]时,前面的一些状态可以舍去,仅仅用中间若干个有效的状态,比如求dp[5]只需要知道dp[4],dp[3],dp[2]就可以了,像这样的情况就可以使用滚动数组来优化
本题具体代码
没有做优化的版本
int tribonacci(int n) {//1.创建dp表//2.初始化//3.填表//4.返回值//处理边界情况if(n==0) return 0;if(n==1 || n==2) return 1;vector<int> dp(n+1);dp[0]=0,dp[1]=dp[2]=1;for(int i=3;i<=n;++i)dp[i]=dp[i-1]+dp[i-2]+dp[i-3];return dp[n];}
优化的版本
int tribonacci(int n) {//1.创建dp表//2.初始化//3.填表//4.返回值//处理边界情况if(n==0) return 0;if(n==1 || n==2) return 1;int a=0,b=1,c=1,d=0;for(int i=3;i<=n;++i){d=a+b+c;a=b,b=c,c=d;//滚动操作}return d;}
LeetCodeOJ练习
斐波那契数列模型
1.<面试题08.01> 三步问题
画图分析:
使用动态规划解决此题的步骤
1.创建dp表
2.确定状态表示
对于一般题都是集合经验和题目要求来确定
常见的经验有:以i位置为结尾xxx;以i位置为开始xxx 对于本题dp[i]表示到i位置的走法数
3.确定状态转移方程
确定方法一般为:以当前i位置状态最近的一步来划分问题,将划分的每个子问题用dp[x]表示
4.初始化,防止出现越界 对dp[1],dp[2],dp[3]进行初始化
5.填表顺序 从左往右
6.返回结果 dp[n]
具体代码:注意细节问题要将相加的结果模1e9+7,防止越界
int waysToStep(int n) {//1.创建dp表//2.初始化//3.填表//4.返回值const int MOD=1e9+7;//处理边界防止越界if(n==1 || n==2) return n;if(n==3) return 4;vector<int> dp(n+1);dp[1]=1,dp[2]=2,dp[3]=4;for(int i=4;i<=n;++i)dp[i]=((dp[i-1]+dp[i-2])%MOD+dp[i-3])%MOD;return dp[n];}
2.LeetCode<746> 使用最小花费爬楼梯
画图分析:
使用动态规划解决此题的步骤:
1.创建dp表
2.确定状态表示
根据经验+题目要求,此处的dp[i]可以表示到达i位置时的最下花费
或者dp[i]表示从i位置开始到顶楼的最小花费
3.确定状态转移方程
(1)dp[i]可以表示到达i位置时的最下花费
对应代码
int minCostClimbingStairs(vector<int>& cost) {//1.创建dp表//2.初始化//3.填表//4.返回结果int n=cost.size();vector<int> dp(n+1);dp[0]=dp[1]=0;for(int i=2;i<=n;++i){dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);}return dp[n];}
(2) dp[i]表示从i位置开始到顶楼的最小花费
对应代码:
int minCostClimbingStairs(vector<int>& cost) {int n=cost.size();vector<int> dp(n);dp[n-1]=cost[n-1],dp[n-2]=cost[n-2];for(int i=n-3;i>=0;--i)dp[i]=cost[i]+min(dp[i+1],dp[i+2]);return min(dp[0],dp[1]);}
3.LeetCode<91> 解码方法
使用动态规划解决此题的步骤
1.创建dp表
2.确定状态表示
方法依旧是根据经验+结合题意
dp[i]表示以i位置为结尾,解析方法的总数(从开始解析到i位置的方法总数)
3.确定状态转移方程
根据最近的一步,划分问题
具体代码为
int numDecodings(string s) {//1.创建dp表//2.初始化//3.填写dp表//4.返回结果int n = s.size();vector<int> dp(n); // 创建⼀个 dp表// 初始化前两个位置dp[0] = s[0] != '0';if(n == 1) return dp[0]; // 处理边界情况if(s[1]!='0') dp[1] += dp[0];int t = (s[0] - '0') * 10 + s[1] - '0';if(t >= 10 && t <= 26) dp[1] += 1;for(int i = 2; i < n; i++){// 如果单独编码if(s[i]!='0') dp[i] += dp[i - 1];// 如果和前⾯的⼀个数联合起来编码int t = (s[i - 1] - '0') * 10 + s[i] - '0';if(t >= 10 && t <= 26) dp[i] += dp[i - 2];}// 返回结果return dp[n - 1];}
对于上述代码我们会发现初始化操作和填写表操作几乎一致,在这里我们就可以对边界问题和初始化问题做优化的
优化的方法为添加虚拟头结点,使新dp表和旧dp表产生如下的映射关系
这里有两个需要注意的问题
(1)虚拟节点里面的值,要确保后面的填表也是正确的
(2)新旧dp表下标间的映射关系
对于(1)的话,新的dp表中,对于计算dp[2]=dp[1]+dp[0],dp[1]是直接映射下来的不用管,重点是dp[0]中的值,当球dp[2]要用到dp[0]时,若原字符串中的第一个和第二个位置字符拼起来能解码成功时,说明s[0]也是可以单独解码成功的,若dp[0]=0的话,就会缺失这个能单独解码的情况,所以dp[0]=1
优化后的代码
int numDecodings(string s) {//1.创建dp表//2.初始化//3.填写dp表//4.返回结果int n = s.size();vector<int> dp(n+1); // 创建⼀个 dp表// 初始化前两个位置dp[0] = 1;dp[1]=s[1-1]!='0';for(int i = 2; i <= n; i++){// 如果单独编码if(s[i-1]!='0') dp[i] += dp[i - 1];// 如果和前⾯的⼀个数联合起来编码int t = (s[i - 2] - '0') * 10 + s[i-1] - '0';if(t >= 10 && t <= 26) dp[i] += dp[i - 2];}// 返回结果return dp[n];}
相关文章:
动态规划<一>初识动态规划
目录 认识动态规划 LeetCodeOJ练习 斐波那契数列模型 认识动态规划 1.动态规划是一种用于解决优化问题的算法策略。 2.它的核心原理是把一个复杂的问题分解为一系列相互关联的子问题。通过先求解子问题,并且记录这些子问题的解(通常用一个表格之类的…...
【AIGC】ChatGPT提示词Prompt精确控制指南:Scott Guthrie的建议详解与普通用户实践解析
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯斯科特古斯里(Scott Guthrie)的建议解读人机交互设计的重要性减轻用户认知负担提高Prompt的易用性结论 💯普通用户视角的分析普通用户…...
2024年10月24日随笔
1024程序员节啊,现在已经是晚上的十点半了,我还在实验室里没走,刚把力扣的每日一题写完,好忙啊,好忙啊,好忙啊,为什么都大三了我还不能做自己的事情,今天老师开会说要给互联网加大赛…...
怎么做系统性能优化
对于软件或系统的性能优化,可以采取多种措施来提高效率和响应速度。这里为您列举一些常见的方法: 1. 代码优化:检查并优化算法复杂度,减少不必要的计算。使用更高效的数据结构和算法。 2. 数据库优化: •索引优化&…...
负载均衡:四层与七层
负载均衡建立在现在网络基础之上,提供一种廉价透明有效的方式扩展网络设备和服务器带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡可分为七层负载与四层负载。 四层负载(目标地址与端口交换) 主要通过报文中…...
【Ubuntu】服务器系统重装SSHxrdpcuda
本文作者: slience_me Ubuntu系统重装操作合集 文章目录 Ubuntu系统重装操作合集1.1 系统安装:1.2 安装openssh-server更新系统包安装OpenSSH服务器检查SSH服务的状态配置防火墙以允许SSH测试SSH连接配置SSH(可选) 1.3 安装远程连…...
ChatGPT的模型训练入门级使用教程
ChatGPT 是由 OpenAI 开发的一种自然语言生成模型,基于 Transformer 架构的深度学习技术,能够流畅地进行对话并生成有意义的文本内容。它被广泛应用于聊天机器人、客户服务、内容创作、编程助手等多个领域。很多人对如何训练一个类似 ChatGPT 的语言模型…...
【OS】2.1.2 进程的状态与转换_进程的组织
✨ Blog’s 主页: 白乐天_ξ( ✿>◡❛) 🌈 个人Motto:他强任他强,清风拂山冈! 🔥 所属专栏:C深入学习笔记 💫 欢迎来到我的学习笔记! 一、进程的状态 1.1.创建态 ……的…...
和为 n 的完全平方数的最少数量
给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。 示…...
Hallo2 长视频和高分辨率的音频驱动的肖像图像动画 (数字人技术)
HALLO2: LONG-DURATION AND HIGH-RESOLUTION AUDIO-DRIVEN PORTRAIT IMAGE ANIMATION 论文:https://arxiv.org/abs/2410.07718 代码:https://github.com/fudan-generative-vision/hallo2 模型:https://huggingface.co/fudan-generative-ai/h…...
如何在Debian 8上使用Let‘s Encrypt保护Apache
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 本教程将向您展示如何在运行 Apache 作为 Web 服务器的 Debian 8 服务器上设置来自 Let’s Encrypt 的 TLS/SSL 证书。我们还将介…...
百科知识|选购指南
百科知识||选购指南 百科知识选购指南茶叶分类茶叶的味道来源茶叶制作步骤名茶其他一些茶叶的知识 百科知识 选购指南 茶叶 分类 茶叶种类: 六大茶类完美分析介绍!茶友推荐收藏 (aboxtik.com) 1.绿茶(发酵率0%) 2.白茶(发酵率…...
Go 语言基础教程:4.常量的使用
在这篇教程中,我们将通过一个简单的 Go 语言程序来学习常量的声明和使用。以下是我们要分析的代码: package mainimport ("fmt""math" )const s string "constant"func main() {fmt.Println(s)const n 500000000const …...
centos服务器重启后,jar包自启动
第一种方法: systemctl服务自启动 在/usr/lib/systemd/system目录下,创建service:start_jar.servie [Unit] DescriptionYour Java Application as a Service Afternetwork.target[Service] Userroot Typesimple ExecStart/usr/bin/java -j…...
华为云实战杂记
配置nginx服务器 首先我们拿到一台服务器时,并不知道系统是否存在Nginx我们可以在Linux命令行执行如下命令查看 find / -name nginx* find / -name nginx* 查找所有名字以nginx开头的文件或者目录,我们看看系统里面都有哪些文件先,这样可以快…...
Lesson10---list
Lesson10—list 第10章 c的list的使用和实现 文章目录 Lesson10---list前言一、list的初始化二、list的遍历1.迭代器2.范围for 三、list常用的内置函数1.sort(慎用)2.unique3.reverse4.merge5.splice 四、模拟实现1.基本框架2.构造函数3.push_back4. 遍…...
ASP.NET Core 8.0 中使用 Hangfire 调度 API
在这篇博文中,我们将引导您完成将 Hangfire 集成到 ASP.NET Core NET Core 项目中以安排 API 每天运行的步骤。Hangfire 是一个功能强大的库,可简化 .NET 应用程序中的后台作业处理,使其成为调度任务的绝佳选择。继续阅读以了解如何设置 Hang…...
查看linux的版本
在 Linux 系统中,有多种方法可以查看当前系统的版本信息。以下是一些常用的方法: 1. 使用 uname 命令 uname 命令可以显示系统的内核版本和其他相关信息。 uname -a这个命令会输出类似如下的信息: Linux hostname 5.4.0-88-generic #99-U…...
Mysql补充
单例 双重检查锁 class Singleton {private static volatile Singleton instance ;private Singleton() {}public static Singleton getInstance(){if(instance null) {synchronized (Singleto.class) {if(instance null){instance new Singleton() ;}} return instance;} …...
com.baomidou.mybatisplus.extension.service.IService用法详解及使用例子
IService 是 MyBatis-Plus 中的一个接口,提供了通用的 CRUD 操作,简化了数据库操作的代码。下面是 IService 的用法详解及示例代码。 1. 引入依赖 确保在你的 pom.xml 中添加了 MyBatis-Plus 的依赖: <dependency><groupId>co…...
植物健康,Spring Boot来保障
5系统详细实现 5.1 系统首页 植物健康系统需要登录才可以看到首页。具体界面的展示如图5.1所示。 图5.1 系统首页界面 5.2 咨询专家 可以在咨询专家栏目发布消息。具体界面如图5.2所示。 图5.2 咨询专家界面 5.3 普通植物检查登记 普通员工可以对普通植物检查登记信息进行添…...
mac-chrome提示您的连接不是私密连接
一、现象介绍 关闭代理之后就ok打开代理,就会提示您的连接不是私密连接 二、原因 由于代理部分的问题,无法找到正确的网站ip地址 三、解决方法 1、键盘直接输入thisisunsafe,可以继续访问网站,如果还是不对的话,那…...
028.爬虫专用浏览器-抓取#shadowRoot(closed)下的内容
一、什么是Shadow DOM Shadow DOM是一种在web开发中用于封装HTML标记、样式和行为的技术,以避免组件间的样式和脚本冲突。它允许开发者将网页的一部分隐藏在一个独立的作用域内,从而实现更加模块化和可维护的代码结构 二、js操作Shadow DOM // 获取宿…...
Serv00 免费虚拟主机 零成本搭建 PHP / Node.js 网站
本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 Serv00 是一个提供免费虚拟主机的平台,包含了 3GB 的存储空间和 512MB 的内存空间,足够我们搭建一个 1IP 的小网站了。同时他还不限制每月的流量,并提供了 16 个数据库&…...
C#里使用ORM访问mariadb数据库
数据库,对于开发人员来说,是必须掌握的内容。 曾经我的老板对我说,只要会数据库的增删查改,就不会没有饭吃。 经过了20年多的工作经历,说明这个是铁的事实,毕竟计算机就是加工数据处理的而设计的。 数据就是信息,信息就是金钱,有了钱就可以有饭吃。 管理数据,就是…...
电商揭秘:商城积分体系简析
引言 商城积分体系划分是一个复杂而细致的过程,它旨在通过积分这一虚拟货币来激励用户行为、提升用户粘性,并促进商城的销售和用户活跃度。以下是对商城积分体系划分的详细解析: 一、积分获取方式 消费积分: 基础积分:…...
[OS] 终端控制(Terminal Control) 暂停执行线程(Suspend Executing Thread)
7. 终端控制(Terminal Control) 在终端中打印信息时,我们可以使用 ANSI 转义序列来控制光标的位置、清除屏幕等操作。\033 是转义字符,用于引导 ANSI 控制码来控制终端显示。可以将它理解为“命令前缀”,后面跟着具体…...
水陆两栖车应对应急事件发挥的作用_鼎跃安全
随着气候变化,城市内涝等问题日益严重。为了应对可能出现的洪水灾害,许多城市开始将水陆两栖车纳入应急救援装备体系。在暴雨引发城市积水时,水陆两栖车可以作为一种高效的救援和运输工具,及时疏散被困群众,运送应急物…...
CI/CD 流水线系统-开源框架Tekton
文章目录 CI/CD 流水线系统-开源框架Tekton什么是TektonTekton优点Tekton 组件介绍Tekton 概念术语 CI/CD 流水线系统-开源框架Tekton 什么是Tekton 官网:https://tekton.dev/ Tekton 是一个强大、灵活的构建 CI/CD 流水线系统的开源框架,允许开发者构建、测试和…...
Spring MVC(下)
博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多JavaEE知识 目录 1.响应 1.1 返回静态页面 1.2 返回数据ResponseBody 1.3 返回HTML代码⽚段 1.4 返回JSON 1.5 设置状态码 1.6 设置Header 2 . …...
织梦和wordpress哪个seo好/企业网站seo哪里好
题目描述 输入一个整数n,计算 输入要求 输入一个整数n(<100)。输出要求 输出计算结果。输入样例 3输出样例 20 参考程序 #include<stdio.h> #include<math.h> int main() { int s0,n,i,a0; scanf("%d",&…...
金华网站建设优化技术/杭州数据推广
题意:每个人都有一个物品,对应一定的钱数,想要得到此物品可以直接出钱,也可以通过用其他人的物品并添加一些钱来交换,问要得到酋长的物品最少需要多少钱?另外,每个人都有一个等级,要…...
tag in wordpress/百度搜索引擎seo
如何优化Springboot线程池并发处理数据方式 创建线程的四种方式 线程通信 Runnable、Callable、Future和FutureTask之一:获取线程的返回值 ThreadPoolExecutor详解 线程池为什么可以复用 把线程池讲的这么清楚 优雅的使用线程池以及源码剖析 线程池中阻塞队…...
建设部网站一级建造师报名/软件开发培训机构去哪个学校
问题:之前做过类似题,但这次仍然不能解决相关问题。 字符串倒过来输:StringBuffer strnew StringBuffer(s); sstr.reverse().toString() Bitset Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total…...
wordpress 2011/app推广方式有哪些
Install Air Conditioning HDU - 4756 题意是要让n-1间宿舍和发电站相连 也就是连通嘛 最小生成树板子一套 但是还有个限制条件 就是其中有两个宿舍是不能连着的 要求所有情况中最大的那个 这是稠密图 用kruskal的时间会大大增加 所以先跑一遍prim 跑完之后对最小生成树里面的边…...
做网站的公司主要工作/今日新闻最新
注意:1.后台控制层接收该控件的参数名必须是 //likeName:根据需求可有可无需要模糊条件查询时添加 (String likeName,Integer page, Integer rows) 注意:2.后台控制层响应回来的数据必须键为rows(数据)和total(数据条数) Map mapnew HashMap(); map.…...