算法设计与分析 动态规划 习题

2023-11-05

3.1

满足递归式F(n)=F(n-1)+F(n-2)和初始值F(0)=F(1)=1的数列称为斐波那契数列。考虑如何计算该数列的第n项F(n)。

(1)说明根据递归式直接完成计算,将有子问题重复求解;
(2)说明该问题具有优化子结构;
(3)写出求解F(n)的动态规划算法,并分析算法的时间复杂性。

3.2

数字三角形问题:设有一个三角形的数塔,顶点为根结点,每个结点有一个整数值。从顶点出发,可以向左走或向右走,如图所示:

要求从根结点开始,请找出一条路径,使路径之和最大,只要输出路径的和。

要求:(1) 写出递推方程;(2)写出算法伪代码;(3) 分析算法的时间复杂度。

  • 解法:从底向上递推, f ( i ) ( j ) = M A X [ f ( i − 1 ) ( j ) , f ( i − 1 ) ( j + 1 ) ] f(i)(j)=MAX[f(i-1)(j), f(i-1)(j+1)] f(i)(j)=MAX[f(i1)(j),f(i1)(j+1)]
  • 复杂度 O ( n ) O(n) O(n)
for (int i=n-1;i>=1;i--){
	for (int j=1;j<=i;j++){
		f[i][j]=max(f[i-1][j], f[i-1][j+1]);
	}
}

3.3

给定一个n×n的矩阵 A,矩阵中的元素只取 0 或者 1。设计一个动态规划算法,求解得到 A 中元素全是 1 的子方阵使其阶数达到最大值。

要求写出伪代码、递归方程并分析算法的时间复杂度。

  • 解法: f ( i ) ( j ) f(i)(j) f(i)(j)表示以第 i i i j j j列的格子为矩阵右下角的阶数最大值
  • f ( i ) ( j ) = M I N ( f ( i − 1 ) ( j − 1 ) , k ) + 1 f(i)(j)=MIN(f(i-1)(j-1), k)+1 f(i)(j)=MIN(f(i1)(j1),k)+1
  • 满足 a [ i ] [ j − h ] = a [ i − h ] [ j ] , h = 0 , 1 , 2 , . . . , k a[i][j-h]=a[i-h][j], h=0,1,2,...,k a[i][jh]=a[ih][j],h=0,1,2,...,k k k k最大

3.4

石子归并问题:在一个圆形操场的四周摆放着n堆石子,现要将石子有次序地合并成一堆。规定每次只能选择相邻的两堆石子合并成新的一堆,并将新一堆石子数记为该次合并的得分。试设计一个动态规划算法,计算出将n堆石子合并成一堆的最小得分和最大得分.

要求列出递归方程,写出算法的伪代码并分析算法的计算复杂性。

  • 解法:分别使用最大堆和最小堆,每次取出两次堆顶元素,合并,计算代价,再放入堆中。

3.5

我们考虑将数轴上的n个点聚成k类的问题。
输入:n个从小到大的不同实数x1, x2, …, xn表示n个不同点,一个参数kn.
任务:将n个点划分成k个不相交的非空集合S1, …., Sk满足⋃_(i=1)^k▒S_i ={x1, x2, …, xn},Si中所有点在Si+1中所有点左边,1i<k,也就是说对于任意xSi, zSi+1, y<z.

目标:最小化∑_(i=1)^k▒〖cost(S_i)〗,其中cost(Si)=(max(Si)-min(Si))2. max(Si)是Si中的最小元素,min(Si)是Si中的最大元素。

例如,如果Si={xj},cost(Si)=0,如果Si={xj, xj+1, …, xj+t}, xj,<xj+1< …< xj+t,那么cost(Si)=(xj+t-xj)2.

  • 思路:猜想代价单调且满足贪心策略(未证明,不确定)
  • 大概像下一题3.6一样,代价计算策略不同

3.6

假设书架上一共有9本书,每本书各有一定的页数,分配3个人来进行阅读。为了便于管理,分配时,各书要求保持连续,比如第1、2、3本书分配给第1人,4、5分配给第二人,6,7,8,9分配给第3人,但不能1,4,2分配给第1人,3,5,6分配给第2人。即用两个隔板插入8个空隙中将9本书分成3部分,书不能换位。同时,分配时必须整本分配,同一本书不能拆成两部分分给两个人。为了公平起见,需要将工作量最大的那一部分最小化,请设计一个动态规划算法。用s1,…,sn表示各本书的页数。

(1)简明的写出问题的递推方程; (2)描述算法伪代码; (3)分析算法的时间复杂度。

  • 解法: f ( i , j ) f(i, j) f(i,j)为从第1到第i本书分为j份的最小最大值
  • 前提:因为一堆书被分为k-1份后,再分一份变成k份一定更优
  • f ( i , j ) = M I N [ M A X [ f ( p , i − 1 ) + s u m [ j ] − s u m [ p ] ] ] , p = i , i + 2 , . . . j − 1 , s u m [ i ] = s i g m a ( 1 , i ) f(i, j)=MIN[MAX[f(p, i-1)+sum[j]-sum[p]]], p=i,i+2,...j-1, sum[i]=sigma(1,i) f(i,j)=MIN[MAX[f(p,i1)+sum[j]sum[p]]],p=i,i+2,...j1,sum[i]=sigma(1,i)

3.7

将一根木棒折成若干份,每折一次的代价是当前这段木棒的长度, 总代价是折这根木棒直到满足要求所需要的所有操作的代价。例如,将一根长度为10的木棒折成四段,长度分别为2, 2, 3, 3,如果先折成长度为2和8的两段,再将长度为8的折成长度为2和6的两段,最后将长度为6的折成长度为3的两段,这些操作的代价是10+8+6=24;如果先折成长度为4和6的两段,在分别将长度为4的折成长度为2的两段、长度为6的折成长度为3的两段,则这些操作的代价是10+4+6=20,比上一种方案更好一些。该问题的输入是木棒的长度L和一些整数c1,…,cn,.

要求将木棒折成长度为c1, …, cn的n段且操作代价最小,请设计动态规划算法解决该问题。

  • 解法:逆向3.4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法设计与分析 动态规划 习题 的相关文章

  • shell判断一个变量是否为空

    shell判断一个变量是否为空 author 润明 2012 2 1 QQ 226399587 http blog csdn net runming918 判断一个变量是否为空 1 变量通过 引号引起来 如下所示 可以得到结果为 IS NU
  • 数据库管理系统

    1 数据库 DB 指长期保存在计算机的存储设备上 按照一定规则组织起来 可以被各种用户或应用共享的数据集合 2 数据库管理系统 DBMS 指一种操作和管理数据库的大型软件 用于建立 使用和维护数据库 对数据库进行统一的管理和控制 以保证数据

随机推荐

  • 工具使用 [ idea远程服务断点调试 ]

    目录 1 概述 1 1 远程代码调试 1 1 1 idea配置 1 1 2 准备HTTP接口 1 1 3 启动远程服务 1 概述 在开发的过程当中 断点调试是我们比较常用的操作 不管是用来解析代码流程 还是用来排查程序错误 都会去使用到断点
  • 高校俱乐部审核期长安大学星辰同学参观CSDN总部

    7月15日早上北京大雨瓢泼 一大早就接到长安大学星辰同学的消息 要来CSDN与我们交流学习 星辰同学填完加入高校俱乐部申请信息后 我们是通过电话和qq与他联系的 据他所说是他的家人推荐他申请加入CSDN高校俱乐部 并且能够增加经验和锻炼能力
  • echarts饼图,自定义legend,解决legend字数太多和太长的问题,翻页处理

    echarts饼图 自定义legend 解决legend字数太多和太长的问题 翻页处理 https blog csdn net weixin 43899935 article details 107185591 版权 tooltip tri
  • 测试中遇到的问题总结

    一 后端问题 数据库存储相关 1 做更新操作后 发现数据没更新 根因 先读取后更新 解决方案 更新再读取 2 缓存数据未及时更新 导致操作不成功 及时更新缓存数据 正常情况在 一分钟内会将数据库数据同步到缓存 如果用户在一分钟之内同时操作了
  • mmdetection 环境配置mmcv和pytorch对照

    版本一 old mmdetection v1 1 0 python 3 7 9 Driver Version 440 33 01 CUDA Version 10 2 mmcv 0 4 3 mmdet 1 1 0 51df8a9 root d
  • IntelliJ IDEA 详细使用教程 – 主题,字体,类和方法注释设置

    IDEA是Java开发者最喜爱的开发工具之一 高端大气 智能化 个性化 每个开发者都喜欢设置自己喜欢的主题 字体 打造一个属于自己的IDE 本次介绍在IDEA中 如何设置主题 字体等样式 和添加类 方法注释 Windows用户直接点击菜单看
  • python接口自动化测试 ( 第三章)

    如果你不太明白这篇文章是做什么的 点击下方进入介绍篇 点击跳转到介绍篇 你可以知道自己能收获什么 和将要做的功能点和是否值得学习 别再迷茫了 不日进 则日退 学习才是你应该做的事情 进入介绍篇了解你将要走的路 python接口自动化测试 第
  • abapdata定义方法_ABAP中types与data,type与like的区别

    1 types与data区别 types是用来自定义某种类型的 需要data实例化才能使用 data是用来声明基本类型数据对象 也就是实例变量 对于用data直接定义的结构体对象 不参照其它结构类型 参照自定义类型生成新数据语法格式 TYP
  • 快速记忆电阻器色环值

    快速记忆电阻器色环值 觉得有用麻烦点个赞哦 开始正文 最近准备电设 看到电阻器11种色环 实在难记 因此花了我整整5 分钟 想出了一个快速记忆的方法 直接上图 上图是标准色环和阻值对应表 下面是我的简记方法 1 谐音组词记忆yyds 2 简
  • Mysql 主从复制

    简述 start slave show slave status G stop slave reset slave delete relay log create relay log reset master delete bin log
  • langchain包下载安装以及基本使用的注意事项

    当我们使用import langchain导入包是需要先下载langchain这个包 注意事项 我们的python版本必须大于等于3 8 1 否者将会导致 cannot import name RecursiveCharacterTextS
  • python三维点云投影(一)

    本文为博主原创文章 未经博主允许不得转载 本文为专栏 python三维点云从基础到深度学习 系列文章 地址为 https blog csdn net suiyingy article details 124017716 一 立体几何基础知识
  • MySQL的多表查询

    目录 多表关系 一对多 多对多 一对一 多表查询概述 分类 显示内连接 外连接 左外连接 右外连接 自连接 联合查询 子查询 分类 标量子查询 列子查询 行子查询 表子查询 多表关系 项目开发中 在进行数据库表结构设计时 会根据业务需求及业
  • 链表介绍

    链表介绍 链表与顺序表一样 也属于线性表 一个线性表是某类数据元素的一个集合 表里同时记录着元素之间的顺序关系 线性表的数据之间有顺序关系 顺序关系分为两种 一种是物理有序 即数据物理存储的位置顺序与数据之间的顺序关系一致 另一种是逻辑有序
  • VS Stuidio 2019实用调试技巧

    VS Studio 2019实用调试技巧 1 debug和release的区别 2 调试 1 调试最常使用的几个快捷键 2 用监视窗口查看临时变量的值 3 查看内存信息 4 查看调用堆栈 5 查看汇编信息 6 查看寄存器信息 3 如何写出易
  • 总结Python设置Excel单元格样式的一切,比官方文档还详细

    总结Python设置Excel单元格样式的一切 比官方文档还详细 Python对Excel表格处理非常方便 本文专门对Excel单元格样式设置进行总结 日常用到的设置基本都可以用openpyxl库完成 创建一个表格 openpyxl是第三方
  • 多项式轨迹--五次多项式轨迹

    转自 https blog csdn net libing403 article details 78715418 多项式轨迹 五次多项式轨迹 1 5 Polynomial of degree five 利用三次多项式 根据过q0 q1 q
  • 祝:天下码农中秋节快乐

    祝 天下码农中秋节快乐
  • 13.2 C语言风格的for命令、while命令和until命令

    C语言风格的for命令 在C语言中 for循环通常定义ige变量 然后这个变量会在每次迭代时自动改变 c语言的for命令 C语言的for命令有一个用来指明变量的特定方法 一个必须保持成立才能继续迭代的条件 以及另一个在每个迭代中改变变量的方
  • 算法设计与分析 动态规划 习题

    3 1 满足递归式F n F n 1 F n 2 和初始值F 0 F 1 1的数列称为斐波那契数列 考虑如何计算该数列的第n项F n 1 说明根据递归式直接完成计算 将有子问题重复求解 2 说明该问题具有优化子结构 3 写出求解F n 的动