动态规划题目集一(代码 注解)

目录

 介绍:

题目一: 

 题目二:

 题目三:

 题目四:

 题目五:

 题目六:

 题目七:

 题目八:

题目九:

 介绍:

动态规划是一种算法设计技术,用于解决具有重叠子问题和最优子结构特征的问题。它通过将大问题拆分成小问题,并保存每个小问题的解以避免重复计算,从而提高算法的效率。

在动态规划中,问题可以通过子问题的最优解来构建整体问题的最优解。动态规划的核心思想是利用已解决的子问题的解来构建更大规模问题的解,以此递推得到最优解。

动态规划通常包含以下三个步骤:
1. 定义问题的状态:将问题划分为若干个子问题,并确定状态变量表示子问题的解。
2. 定义状态转移方程:通过递推关系式,将大问题的解表示为小问题的解。
3. 定义边界条件:确定问题的初始状态,即最小规模的子问题的解。通常是一些边界情况。

动态规划适用于那些具有重叠子问题和最优子结构特征的问题,例如最长公共子序列、背包问题、最短路径等。通过利用动态规划,我们可以将问题的时间复杂度从指数级别降低到多项式级别,从而提高算法的效率。

题目一: 

#include<iostream>
#include<cstring>
using namespace std;
int main()
{long long a[110][110];//第i行第j个可取的最大值int n;long long ans = 0;cin >> n;memset(a, 0, sizeof(a));for (int i = 1; i <= n; i++){for (int j = 1; j <= i; j++){cin >> a[i][j];a[i][j] += max(a[i - 1][j], a[i - 1][j - 1]);//正上方的和斜上角的取大的加ans = max(ans, a[i][j]);}}cout << ans;
}

 题目二:

#include<iostream>
#include<cstring>
using namespace std;
int n;
int a[100100];
int f[100100];//以第j个结尾的最大子段和
int ans = 0;
int main()
{cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];}f[1] = a[1];//第一个就为第一个的值for (int i = 2; i <= n; i++){f[i] = max(f[i - 1] + a[i], a[i]);//比较i-1子段和加上当前的数是否大于当前数ans = max(ans, f[i]);}cout << ans << endl;}

 题目三:

#include<iostream>
#include<cstring>
using namespace std;
int n;
int a[300][300];//i站到j站的租金
int f[300];//到j站的最少的租金
int main()
{cin >> n;for (int i = 1; i <= n; i++){for (int j = i + 1; j <= n; j++){cin >> a[i][j];}}for (int i = 1; i <= n; i++){for (int j = i + 1; j <= n; j++){if(i==1)f[j]=a[i][j];//每站初始为1直接到各个站elsef[j] = min(f[j], f[i] + a[i][j]);//选i为中转站,不选继承,选了则f[i]+a[i][j]}}cout << f[n] << endl;
}

 题目四:

#include<iostream>//求翻转字符串和原字符串的公共子序列
#include<algorithm>
#include<cstring>
using namespace std;
string str, str1;
int dp[1001][1001];//表示到str字符串的第i个与str1字符串的第j个有的最长公共子序列
int main()
{memset(dp, 0, sizeof(dp));cin >> str;int len = str.length();str1 = str;reverse(str.begin(), str.end());//翻转for (int i = 1; i <= len; i++){for (int j = 1; j <= len; j++)if (str[i - 1] == str1[j - 1])dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + 1);elsedp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}printf("%d\n", len - dp[len][len]);
}

 题目五:

#include<iostream>
#include<cstring>
using namespace std;
struct node
{int w, step;
};
node dp[110][110];
int n, m, a[110][110];
int main()
{memset(dp, 0, sizeof(dp));cin >> n >> m;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++){cin >> a[i][j];}for (int j = 1; j <= m; j++)//第一行{dp[1][j].w = dp[1][j - 1].w + a[1][j];dp[1][j].step = 1;}for (int i = 1; i <= n; i++)//第一列{dp[i][1].w = dp[i - 1][1].w + a[i][1];dp[i][1].step = 1;}for (int i = 2; i <= n; i++)for (int j = 2; j <= m; j++){if (dp[i - 1][j].w > dp[i][j - 1].w)//上>左{dp[i][j].w = dp[i - 1][j].w + a[i][j];dp[i][j].step = dp[i - 1][j].step;}else if (dp[i - 1][j].w < dp[i][j - 1].w)//上<左{dp[i][j].w = dp[i][j - 1].w + a[i][j];dp[i][j].step = dp[i][j - 1].step;}else//相等时{dp[i][j].w = dp[i - 1][j].w + a[i][j];dp[i][j].step = dp[i][j - 1].step + dp[i - 1][j].step;//两个步数相加}}cout << dp[n][m].w << " " << dp[n][m].step << endl;
}

 题目六:

#include<iostream>
#include<cstring>
using namespace std;
int a[1010100], b[1010100],dp[1010100];
int n,tmp;
void prin(int k)
{if(k>n-3)//大于n-3 即可以直接跳到终点{ cout<<k<<endl;return ;}elsecout<<k<<" ";prin(b[k]);
}
int main()
{memset(a, 0, sizeof(a));cin >> n;for (int i = 0; i <= n; i++){cin >> a[i];}for (int i = n - 3; i >= 0; i--)//从后往前走{tmp = a[i + 1];//从后一格来b[i] = i + 1;if (tmp > a[i + 2])//后两格{b[i] = i + 2;tmp = a[i + 2];}if (tmp > a[i + 3])//后三格{b[i] = i + 3;tmp = a[i + 3];}a[i] += tmp ;}cout << a[0] << endl;prin(0);
}

 题目七:

#include<iostream>//最长公共子序列
#include<cstring>
using namespace std;
int dp[2010][2010];
int main()
{string s1, s2;cin >> s1 >> s2;memset(dp, 0, sizeof(dp));int len1 = s1.size(), len2 = s2.size();for (int j = 1; j <= len2; j++)  dp[0][j] = dp[0][j - 1] + 1;for (int i = 1; i <= len1; i++)  dp[i][0] = dp[i - 1][0] + 1;for (int i = 1; i <= len1; i++){for (int j = 1; j <= len2; j++){if (s1[i - 1] == s2[j - 1])//两个字符相同,不做操作dp[i][j] = dp[i - 1][j - 1];else//不相同,选择三种操作中,操作数最小的dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;}//dp[i-1][j-1]表示替换,dp[i-1][j]表示删除a[i]字符,dp[i][j-1]表示在a[i]后插入}cout << dp[len1][len2] << endl;
}

 题目八:

#include<iostream>
#include<cstring>
using namespace std;
int n;
int a[100100];
int f[100100];//以j结尾的最大递增序列
int ans = 0;
int main()
{cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];f[i] = 1;//以i结尾的数的最大递增序列,起始都是包含自己的一个}for (int i = 1; i <= n; i++){for (int j = 1; j <= i; j++)//从a[1]到a[i]的循环{if (a[i] > a[j] && f[j]+1 > f[i])//第i个大于第j个且 以j结尾的最大递增序列加上一个(即a[i]这个数)大于 原先以i结尾的最大递增子序列{f[i] = f[j] + 1;ans = max(ans, f[i]);}}}cout << ans <<endl;
}

题目九:

#include<iostream>//看成背包问题
using namespace std;
int v[21];
int dp[1000001];//表示装j有几种方法
int mod = 1e9;
int main() 
{int i, j, n, k;v[0]=1;for (i = 1; i <= 20; i++)//初始化体积v[i]=2*v[i-1];for (j = 0; j <= 1000000; j++) //每个j都至少有一种方法,全为1dp[j] = 1;for (i = 1; i <= 20; i++)//从第一件物品开始装,每件物品有无限个for (j = v[i]; j <= 1000000; j++)dp[j] = (dp[j] + dp[j - v[i]]) % mod;cin>>n;while (n--){cin >> k;cout << dp[k];if (n != 0)cout << " ";}}

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

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

相关文章

水泵房远程监控物联网系统

随着物联网技术的快速发展&#xff0c;越来越多的行业开始利用物联网技术实现设备的远程监控与管理。水泵房作为城市供水系统的重要组成部分&#xff0c;其运行状态的监控与管理至关重要。HiWoo Cloud作为专业的物联网云服务平台&#xff0c;为水泵房远程监控提供了高效、稳定、…

Java访问数据库(重点:SpringBoot整合Mybatis)

目录 一、通过JDBC访问数据库1、思路2、示例3、思考 二、通过ORM框架访问数据库&#xff08;主要是Mybatis&#xff09;1、示例1.1 配置1.2 SQL写在xxxMapper.xml中&#xff1a;mapper/UserMapper.xml1.3 xxxMapper.xml对应的xxxMapper接口&#xff08;Application通过该接口访…

磁盘未格式化,数据恢复有妙招

一、初遇磁盘未格式化&#xff0c;惊慌失措 在日常生活和工作中&#xff0c;我们经常会使用各种存储设备来保存重要的文件和数据。然而&#xff0c;有时当我们尝试访问这些存储设备时&#xff0c;却会突然遇到一个令人头痛的问题——磁盘未格式化。这个突如其来的提示让我们措…

[Python初阶]2255.统计是给定字符串前缀的字符串数目

目录 2255.统计是给定字符串前缀的字符串数目 ①.题目 ②.问题分析 ③.startswith()方法理解 与 说明 Ⅰ.定义和用法 Ⅱ.语法 ④.问题解决 ⑤总结 2255.统计是给定字符串前缀的字符串数目 ①.题目 ②.问题分析 需求:统计列表words中,是字符串s的前缀的字符串的数目. 解…

接口与多态

通过接口实现多态 接口中声明若干个 bstract方法&#xff1b; 方法体的内容细节由实现接口的类去完成&#xff0c;不同的类有 不同的实现方式 → 则接口变量在回调接口方法时具有多 种形态。 用接口进行程序设计的核心思想 使用接口回调技术&#xff1a;接口变量存放实现该接口…

(学习日记)2024.03.13:UCOSIII第十五节:基于时基列表的时延操作(持续更新)

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

《LeetCode热题100》笔记题解思路技巧优化_Part_3

《LeetCode热题100》笔记&题解&思路&技巧&优化_Part_3 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题链表&#x1f7e2;1. 相交链表&#x1f7e2;2. 反转链表&…

大数据数据分析-scala、IDEA、jdk之间的搭配关系

Scala主要是一门面向对象编程语言和函数式编程语言。 一、大数据框架&#xff08;处理海量/流式数据&#xff09; - ---以HADOOP 2. x为系列的大数据生态系统处理框架 离线数据分析&#xff0c;分析的数据为N1天数据 -----MapReduce 并行计算框架&#xff0c;分而治之…

数据治理系统论-结合数据要素等

什么是数据治理&#xff1f; 数据治理是指组织内外部对数据进行管理和监控的全面框架。它涵盖了数据的安全、合规性、可用性和价值最大化等方面。通过有效的数据治理&#xff0c;组织能够更好地理解其数据资产&#xff0c;并确保数据被正确地管理和利用。 数据治理的重要性 在…

django实现api接口

&#xff08;前期准备&#xff09;第一步&#xff1a;虚拟环境 在windows上使用virtualenvwrapper。 pip install virtualenvwrapper-win 接着&#xff0c;添加环境变量。 echo %WORKON_HOME% 接下来就是创建虚拟环境&#xff0c;假如创建myenv mkvirtualenv myenv 进入…

sqllab第二十八关通关笔记(附带28a)

知识点&#xff1a; union select 整体过滤 union all select 替换where id(输入)空格 过滤了&#xff0c;使用%09代替 经过不断的测试&#xff0c;发现原始语句为 where id(输入) 构造payload:id1)and%091(1 成功回显出了相关的信息 好&#xff0c;尝试进行错误注入 构造…

java虚拟机的堆核心知识介绍

Java虚拟机&#xff08;JVM&#xff09;的堆&#xff08;Heap&#xff09;是Java内存模型中一个至关重要的部分。它是运行时数据区&#xff0c;用于存储Java对象实例。堆是垃圾收集器工作的地方&#xff0c;也是Java应用程序内存管理的关键区域。在本教程中&#xff0c;我们将深…

nvm安装,nvm使用及常用命令,node版本管理

前端学习交流QQ群&#xff1a;1群&#xff1a;173683895 &#xff0c;2群: 173683866 承接项目开发&#xff0c;需求功能开发&#xff0c;博主微信号&#xff1a;Jay_09168 安装包下载地址 下载使用 安装&#xff1a; 点击 nvm-setup.exe&#xff0c;按下图步骤安装&#…

STM32系列——F103C8T6 控制SG90舵机(HAL库)

文章目录 一、舵机控制原理二、.CubeMX配置配置RCC、SYS、时钟树配置RCC配置SYS配置时钟树配置定时器产生PWM波形 Keil5代码接线图及效果如果您发现文章有错误请与我留言&#xff0c;感谢 一、舵机控制原理 舵机的控制一般需要一个20ms左右的时基脉冲&#xff0c;该脉冲的高电平…

(含链接)2024年NVIDIA GPU技术大会开发者合集(专为开发者挑选的合集)

2024年NVIDIA GPU技术大会开发者合集 我专门为开发者整理了NVIDIA GPU技术大会上专注技术的内容合集, 希望可以帮助开发者朋友们快速了解NVIDIA的最新技术. 注意:在电脑端打开更友好, 可以直接进入每一项的网页 文章目录 2024年NVIDIA GPU技术大会开发者合集如何登录和预约会…

[AutoSar]BSW_Com015 PDUR 模块配置

目录 关键词平台说明一、Abbreviations二、PduRBswModules三、PduRGeneration四、PduRDestPdus4.1 全局PDU ID和本地PDU ID 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c; EB芯片厂商TI 英飞凌编程语言C&#xff0…

react中setState是同步的还是异步的

首先说一下setState是同步的还是异步的&#xff1f; 1.解读 setState 工作流 接下来我们就沿着这个流程&#xff0c;逐个在源码中对号入座。首先是 setState 入口函数&#xff1a; ReactComponent.prototype.setState function (partialState, callback) {this.updater.enqu…

ThingsBoard初始化数据库Postgres

本章将介绍ThingsBoard的本地环境搭建&#xff0c;以及源码的编译安装。本机环境&#xff1a;centos7&#xff0c;docker,postgres 环境安装 开发环境要求&#xff1a; docker pcentos7 &#xff1b;docker&#xff1b;postgres: 1、使用Docker创建postgres容器化创建 docker…

JS函数知识点(复习)

在 JavaScript&#xff08;JS&#xff09;中使用函数有多种原因&#xff0c;这些原因不仅涉及到代码的组织和可读性&#xff0c;还涉及到代码的可维护性、复用性以及程序的模块化等方面。以下是一些关键的理由&#xff1a; 代码重用&#xff1a;函数允许你将一段代码块封装起来…

基于深度学习的唇语识别系统的设计与实现

概要 人工智能作为三大工程之一&#xff0c;从上个世纪至今仍然活跃于各个行业的研究与应用之中&#xff0c;应时代的热潮方向&#xff0c;本 课题主要针对深度学习技术应用于唇语识别当中&#xff0c;实现词语唇语的翻译功能。唇语识别在图像处理中一直是一个富 有挑战性的课题…