算法设计与分析-DP习题

news2024/11/28 15:41:10

7-1 最小路径和

给定一个m行n列的矩阵,从左上角开始每次只能向右或者向下移动,最后到达右下角的位置,路径上的所有数字累加起来作为这条路径的和。求矩阵的最小路径和。

输入格式:

输入第一行:两个正整数m和n(1<=m, n<=1000),以空格隔开,为矩阵的行数和列数;接下来m行,每行n个整数,为给定的矩阵。

输出格式:

输出只有一行:一个整数,为矩阵的最小路径和。

输入样例:

输出样例:

提示:

1、可记dp(i,j)由左上角开始到达i行j列后的最小路径和,则dp(m,n)为所求。

2、请参考教材:"8.4 求解三角形最小路径问题"的示例。

如果不采用动态规划法,本题不得分!

思路:

数字三角形dp模型 状态转移方程

AC代码:

7-2 袋鼠过河

一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子,每隔1米就有1个,第一个桩子就打在河岸边,对岸的岸边没有桩子,如下图:

每个桩子上有一个弹簧,袋鼠跳到弹簧上就可以跳的更远。每个弹簧力量不同,用一个数字代表它的力量,如果弹簧的力量是5,就表示袋鼠下一跳最多能跳5米,如果是0,就表示会陷进去无法继续跳跃。河流一共n米宽,袋鼠初始在第一个弹簧上面,给定每个弹簧的力量,求袋鼠最少需要多少跳能够到达对岸。如果无法到达,输出-1。

输入格式:

输入包括两行,第1行为河的宽度n(1<=n<=10000),第2行为n个整数ai(0<=ai<=20,且ai<n),表示每个弹簧的力量,用空格隔开。

输出格式:

输出到达对岸的最少跳数,若无法到达,输出-1。

输入样例1:

输出样例1:

输入样例2:

输出样例2:

输入样例3:

输出样例3:

提示:

1、可假想在对岸的岸边也有一个桩子,从初始位置开始给这些桩子编号,(假设从0开始编)则编号范围为0~n,记dp(i)为到达编号为i的桩子的最少跳数,则dp(n)为所求。

2、如果不采用动态规划法,本题不得分!

AC代码:

题目来源:搜狐2017秋招研发工程师笔试-袋鼠过河

7-3 数字和

给定一个有n个正整数的数组a和一个整数sum,求选择数组a中的部分数字和为sum的方案数。若两种选取方案有一个数字的下标不一样,则认为是不同的方案。

输入格式:

输入包括两行,第1行为两个正整数n和sum(1<=n, sum<=1000),第2行为n个正整数ai(32位整数),并以空格隔开。

输出格式:

输出所求的方案数。

输入样例:

输出样例:

提示:

1、可记dp(i,j)为处理完前i个数字后,选取的数字和为j的方案数,则dp(n,sum)为所求。

2、特别注意:若i为0,即无数字可选,则只要j≠0,方案数均为0;若j为0,则无论i为何值,均有一种方案可选,即空集。

3、如果不采用动态规划法,本题不得分!

思路:

背包问题求解方案数 注意开long long

状态转移方程:

AC代码

7-4 买股票

“低价购买”这条建议是在股票市场取得成功的一半规则。要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买;再低价购买”。每次你购买一支股票,必须用低于你上次购买它的价格购买它。买的次数越多越好!你的目标是在遵循以上建议的前提下,求出最多能购买股票的次数。题目给出一段时间内一支股票每天的出售价,你可以选择在哪些天购买这支股票。每次购买都必须遵循“低价购买;再低价购买”的原则。写一个程序计算最大购买次数。

例如,这里是某支股票的价格清单:

日期:1,2,3,4,5,6,7,8,9,10,11,12

价格:68,69,54,64,68,64,70,67,78,62,98,87

最优秀的投资者可以购买最多4次股票,可行方案中的一种是:

日期:2,5,6,10

价格:69,68,64,62

输入格式:

输入包含多个样例,每个输入样例:

第1行: N(1<=N<=5000),股票发行天数

第2行: N个数,是每天的股票价格(216范围内的正整数)。

输出格式:

对应每个输入样例,输出1行,1个整数:最大购买次数。

输入样例:

输出样例:

提示:

1、最长单调递减子序列问题;

2、如果不采用动态规划法,本题不得分!

AC代码:

7-5 愤怒的小鸟

游戏"愤怒的小鸟",各位仙家都玩过了吧,俗话说:“飞得越高,砸得更狠”,各小鸟们在游戏中简直是各显神通,竞相飞得更高,哪怕是粉身碎骨,但求美名留人间。

为了获得更高的飞越高度,小鸟们不知从何处得到了一批神力大补丸,吃了这些大补丸将可以帮助小鸟们获得更高的飞行高度。不幸的是,不知道那个该死的叛徒走漏了消息,可恶的绿猪获得了这个情报,于是他们贿赂了当地的一个巫师,希望巫师从中作梗为难小鸟们,于是巫师连夜在这批大补丸上施加了一种可怕的诅咒,就是小鸟们在服用这些大补丸时,当吃到奇数个大补丸会增加飞行功力(增加值为该大补丸的“药力”值);吃到偶数个大补丸会降低飞行功力(降低值也是该大补丸的“药力”值),当然小鸟们在挑选时可以跳过某些大补丸不吃。小鸟们有点犯难,虽然说只要谨慎挑选是可以确保吃了这批大补丸后能得到功力的提升,但挑选不当也可能会导致功力的降低,因此绝不可以随便处理了事,更何况神力大补丸之所以称为神力,那可是花了高价钱好不容易才搞到手的。有没有一种选择方案可以让这批神力大补丸发挥最大的药效呢?

幸好,小鸟们有个当程序员的朋友,也就是你,他们现在求助于你,那么你能找到一种选择方案可以让这批神力大补丸发挥最大的药效吗?

注:场景设计原创,转载请标明出处!

输入格式:

输入有多组用例,对每组用例:

第1行:一个整数n(1<=n<=150,000),表示大补丸的数量

第2行:包含n个整数pi(1<=pi<=500),每个整数表示一个大补丸的“药力”值。假设小鸟们只能按这个给定的次序依次挑选大补丸。

输出格式:

对应每个输入样例,输出1行:一个整数,食用这批神力大补丸后能达到的最大的药效。

输入样例:

输出样例:

提示:

样例解释:第1个样例,依次取7,1,8,3,6,最大的药效=7-1+8-3+6=17;第2个样例,依次取141,41,152,28,145,26,176,最大的药效=141-41+152-28 +145-26+176=519。

1、思路:可分别标记处理完第i个大补丸后,当前拿到的是偶数个大补丸或者是奇数个大补丸的最优值,再考虑上一个状态如何到达这个状态。最终解为处理完最后一个大补丸后,当前是偶数个大补丸的最优值和当前是奇数个大补丸的最优值的较大值。

  1. 如果不采用动态规划法,本题不得分!

AC代码:

7-6 矩阵连乘问题

给定n个矩阵A1,A2,…,An,其中,AiAj+1是可乘的,i=1,2,…,n-1。

你的任务是要确定矩阵连乘的运算次序,使计算这n个矩阵的连乘积A1A2…An时总的元素乘法次数达到最少。

例如:3个矩阵A1,A2,A3,阶分别为10×100、100×5、5×50,计算连乘积A1A2A3时按(A1A2)A3所需的元素乘法次数达到最少,为7500次。

输入格式:

测试数据有若干组,每组测试数据有2行。

每组测试数据的第1行是一个整数n(1<=n<=100),第2行是n+1个正整数p0、p1、p2、…、pn,这些整数不超过100,相邻两个整数之间空一格,他们表示n个矩阵A1,A2,…,An的阶pi−1×pi,i=1,2,…,n。

输出格式:

对输入中的每组测试数据,输出2行。先在一行上输出“Case #”,其中“#”是测试数据的组号(从1开始),再在第2行上输出计算这n个矩阵的连乘积A1,A2,…,An时最少的总的元素乘法次数。

输入样例:

输出样例:

提示:

1、分析最优解的结构:

设计求解具体问题的动态规划算法的第一步是刻画该问题的最优解的结构特征。我们将矩阵连乘积AiAi+1....Aj简记为A[i:j]。考察计算A[1:n]的最优计算次序。设这个计算次序在矩阵AkAk+1之间将矩阵链断开,1<=k<n,则其相应的完全加括号形式为((A1...Ak)(Ak+1...An))。以此次序,总的计算量为A[1:k]的计算量加上A[k+1:n]的计算量, 再加上A[1:k]和A[k+1:n]相乘的计算量。

这个问题的关键特征是:计算A[1:n]的最优次序所包含的计算矩阵子链A[1:k]和A[k+1:n]的次序也是最优的。因此,矩阵连乘积计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。问题的最优子结构性质是该问题可以用动态规划算法求解的显著特征。

  1. 建立递归关系

从连乘矩阵个数为2开始计算每次的最小乘次数:m[0][1]、m[1][2]、m[2][3]、m[3][4]、m[4][5],其中m[0][1]表示第一个矩阵与第二个矩阵的最小乘次数;

然后再计算再依次计算连乘矩阵个数为3的最小乘次数:m[0][2]、m[1][3]、m[2][4]、m[3][5];

连乘矩阵个数为4的最小乘次数:m[0][3]、m[1][4]、m[2][5]

连乘矩阵个数为5的最小乘次数:m[0][4]、m[1][5]

连乘矩阵个数为6的最小乘次数:m[0][5],这个是最后我们要的结果。

m[i][j]给出了最优值,即计算A[i:j]所需的最少数乘次数。同时还确定了计算A[i:j]的最优次序中的断开位置k,也就是说,对于这个k有:

m[i][j]=m[i][k]+m[k+1][j] + Pi−1∗PkPj

若将对应于m[i][j]的断开位置k记为s[i][j],在计算最优值m[i][j]后,可以递归地有s[i][j]构造出相应的最优解。

  1. 计算最优值

根据计算m[i][j]的递归式,容易写一个递归算法计算m[1][n]。但是简单地递归将好费指数计算时间。在递归计算时,许多子问题被重复计算多次。这也是该问题可以用动态规划算法求解的又一显著特征。

用动态规划算法解决此问题,可依据其递归是以自底向上的方式进行计算。在计算的过程中,保存以解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算。

4、如果不采用动态规划法,本题不得分!

AC代码:

7-7 极速滑雪

北京冬奥会开赛在即,想体验一下什么是速度与激情吗?那么你应该了解一个叫做极速滑雪的运动,这个运动绝对是惊险与刺激的完美结合,需要足够的勇气与胆量!滑雪开始时,必须选择一个制高点然后向低处滑,到下一个位置继续选择一个较低的位置往下滑…,如果每次选择的位置极佳,将会获得最快的滑行速度以及最长的滑行长度。但如果不幸滑入一个洼地(四周位置都高于当前所处的位置),那么将不得不结束比赛并且最终成绩为总的滑行长度。赛事的评价标准很简单,就是谁的滑行长度最长,冠军就将花落谁家。现在,你的任务就是帮助选手找到一条最长的滑行赛道!

滑雪区域将由一个二维数组给出,数组元素的值代表每个位置的高度值。下面是一个例子:

每个选手可以从某个位置滑向东南西北相邻四个位置之一,并且必须高度减小(即不能向上滑)。在上面的例子中,一条可滑行的赛道为24-17-16-1(长度=4);当然25-24-23-...-3-2-1(长度=25)更长,事实上,这是最长的一条,如下图所示:

注:场景设计原创,转载请标明出处!

输入格式:

输入的第一行包括空格隔开的两个整数,表示滑雪区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有空格隔开的C个整数,代表高度h(0<=h<=10000)。

输出格式:

输出最长的滑行赛道的长度。

输入样例:

输出样例:

提示:

1、思路:高度排序,从最低位置开始循环更新其四周四个位置的赛道长度(假设当前位置四周的某个位置为i,若i的高度比当前位置高,且以i为起点的赛道长度<以当前位置为起点的赛道长度+1,则以i为起点的赛道长度=以当前位置为起点的赛道长度+1),max{以位置j为起点的赛道长度}为所求,其中1≤j≤R*C。

2、如果不采用动态规划法,本题不得分!

思路:记忆化搜索

AC代码:

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

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

相关文章

【C++】非类型模板参数、模板特化、模板的分离编译、模板总结

文章目录一、非类型模板参数二、模板特化1.函数模板特化2.类模板特化三、模板的分离编译四、模板总结一、非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 #define N 10…

Spring_FrameWork_05(AOP)

Spring整合Junit RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(classes SpringConfig.class)加载test运行类和spring配置文件 使用Junit提供的Runwith注解&#xff0c;将Junit原有的运行器替换成spring提供的SpringJUnit4ClassRunner。 这个注解的值就是运…

【计算机视觉】Softmax代码实现、过拟合和欠拟合的表现与解决方法

Softmax原理 Softmax函数用于将分类结果归一化&#xff0c;形成一个概率分布。作用类似于二分类中的Sigmoid函数。 对于一个k维向量z&#xff0c;我们想把这个结果转换为一个k个类别的概率分布p(z)。softmax可以用于实现上述结果&#xff0c;具体计算公式为&#xff1a; 对于k…

程序员不了解这些投简历的巨坑,面试注定一开始就失败!

目录 前言第一阶段&#xff1a;练手第二阶段&#xff1a;冲刺第三阶段&#xff1a;收尾 前言 之前写了两篇文章&#xff0c;给大家介绍了一下如何利用短期的时间&#xff0c;尽可能充分的为面试做准备&#xff1a; 1.《我只是把握好了这3点&#xff0c;1个月后成功拿下大厂…

2023春节祝福系列第一弹(下)(放飞祈福孔明灯,祝福大家身体健康)(附完整源代码及资源免费下载)

2023春节祝福系列第一弹&#xff08;下&#xff09; &#xff08;放飞祈福孔明灯&#xff0c;祝福大家身体健康&#xff09; &#xff08;附完整源代码及资源免费下载&#xff09; 目录 四、画一朵真实的祥云 &#xff08;1&#xff09;、画一个渐变的白色径向渐变背景 &a…

外业调查工具助手,照片采集、精准定位、导航、地图查看

你是不是在外业调查时要背着一堆图纸 是不是一不小心图纸污损或丢失&#xff0c;工作又得重做 是不是经常会出现图纸标注的空间不足 是不是外业采集中要携带一大堆繁琐的仪器 是不是每次收集的数据、照片等在整理的过程中发现工作量巨大 是不是经常会出现采集回来的内容跟…

《MySQL 入门教程》第 36 篇 Python 访问 MySQL

本篇我们介绍如何利用 Python DB API 连接和操作 MySQL 数据库&#xff0c;包括数据的增删改查操作、存储过程调用以及事务处理等。 Python 是一种高级、通用的解释型编程语言&#xff0c;以其优雅、准确、 简单的语言特性&#xff0c;在云计算、Web 开发、自动化运维、数据科…

Spark / Java - atomic.LongAccumulator 与 Spark.util.LongAccumulator 计数使用

目录 一.引言 二.atomic.LongAccumulator 1.构造方法 2.使用方法 3.创建并使用 三.Spark.util.LongAccumulator 1.构造方法 2.使用方法 一.引言 使用 Spark 进行大数据分析或相关操作时&#xff0c;经常需要统计某个步骤或多个步骤的相对耗时或数量&#xff0c;java.u…

Java设计模式-适配器模式Adapter

介绍 适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示&#xff0c;主的目的是兼容性&#xff0c;让原本 因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)适配器模式属于结构型模式主要分为三类&#xff1a;类适配器模式、…

树莓派自带的python3.9->python3.7

卸载python3.9&#xff1a;sudo apt-get remove python3卸载之后一些包可以使用sudo apt autoremove这个命令删除卸载成功如果出现问题后续再来更新&#xff08;出现问题后后续安装python也会失败&#xff09;&#xff08;先不要安装先看&#xff09;安装python3.7&#xff1a;…

C语言第30课笔记

1.strerror(errno要包含头文件errno.h) 2.perror头文件为stdio.h 3.一些字符函数 4.字母大小写转换函数 5.memmove理论上是memcpy的升级版(可以自己拷贝自己)。 6.匿名结构体类型在类型创建好了之后直接创建变量&#xff0c;只能用一次。两个完全相同的匿名结构体类型&#xf…

【八】Netty HTTP协议--文件服务系统开发

Netty HTTP协议--文件服务系统开发介绍HTTP-文件系统场景描述流程图代码展示netty依赖服务端启动类 HttpFileServer服务端业务逻辑处理类 HttpFileServerHandler结果展示错误路径文件夹路径文件路径遗留bugbug版本总结介绍 由于Netty天生是异步事件驱动的架构&#xff0c;因此…

java EE初阶 — Synchronized 的原理

文章目录1. Synchronized 的优化操作1.1 偏向锁1.2 轻量级锁&#xff08;自旋锁&#xff09;1.3 重量级锁2. 其他的优化操作2.1 锁消除2.2 锁粗化3. 相关面试题1. Synchronized 的优化操作 两个线程针对同一个对象加锁&#xff0c;就会产生阻塞等待。 Synchronized 内部其实还有…

ubuntu docker elasticsearch kibana安装部署

ubuntu docker elasticsearch 安装部署 所有操作尽量在root下操作. 安装docker 1. 由于是基于宝塔面板安装的所以简答的点击操作即可完成安装. 我这里已经是正常的安装好了. 2.dcoker 镜像加速 https://cr.console.aliyun.com/cn-hangzhou/instances访问这个网址进去进行了…

快速上手Golang

自动推导赋值:自动推导赋值Go中 不同的数据类型不能进行计算对于浮点型默认都是float64 精确到小数点后15位单引号的 为字节类型 一位0~255的字符转换双引号的 为字符串类型多重赋值多重赋值a,b:1,2格式输出格式输出printf“%3d”三位整数&#xff0c;不满足三位时头部补空格“…

录制课程用什么软件好?3款超好用的课程视频录课软件

在互联网技术的飞速发展下&#xff0c;在线教学已经成为一种新型的教学形式&#xff0c;与传统的教学方法相比&#xff0c;在线教学具有低成本、突破地域、时间灵活、形式多样的教学方式。那录制课程用什么软件好&#xff1f;今天小编就跟大家分享3款超好用的课程视频录课&…

认真研究MySQL的主从复制(一)

【1】主从复制概述 ① 如何提升数据库并发能力 在实际工作中&#xff0c;我们常常将Redis作为缓存与MySQL配合使用&#xff0c;当有请求的时候&#xff0c;首先会从缓存中进行查找。如果存在就直接取出&#xff0c;如果不存在再访问数据库。这样就提升了读取的效率&#xff0…

中国数据库的诸神之战

作者 | 唐小引出品 | 《新程序员》编辑部“现在的数据库产品实在是太多了&#xff01;”前几天&#xff0c;我和深耕数据库/大数据近 30 年的卢东明老师相聊时&#xff0c;他发出了这样的感慨。将包括 DB-Engines Ranking 以及国内数据库排行等在内的数据库产品列表进行汇总&am…

快速入门Freemarker模块引擎技术

1、 freemarker 介绍 ​ FreeMarker 是一款 模板引擎&#xff1a; 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&#xff0c;源代码等)的通用工具。 它不是面向最终用户的&#xff0c;而是一个Java类库&am…

采场的车辆管理及卸料点计数管理有哪些难题需要解决

近期&#xff0c;安环部检查采矿区域工程车辆驾驶人员情况时&#xff0c;发现有部分驾驶员及工作人员存在违规顶替情况&#xff0c;有非注册备案人员驾驶矿用工程车辆违规作业。为了进行统一有效的人员车辆管理&#xff0c;同时能监督安全员定期对采矿作业区进行安全巡查&#…