算法分析与设计(线下作业二)

合集下载

算法分析与设计大作业

算法分析与设计大作业

算法分析与设计大作业摘要:本文以算法分析与设计为主题,对算法的概念、分析和设计进行了探讨。

首先介绍了算法的概念和基本特征,其次分析了算法的效率和复杂度,并介绍了常用的算法复杂度表示方法。

然后,通过实例分析了几种常用的排序算法的性能与复杂度,并对它们进行了比较。

最后,总结了算法分析与设计的重要性,并提出了进一步研究的方向。

一、引言随着计算机技术的快速发展,算法分析与设计成为计算机领域中的重要研究方向。

算法是指解决特定问题的具体步骤和方法,是计算机科学的核心和基础。

算法的效率和复杂度对计算机的性能和运行时间有着直接的影响,因此算法的分析和设计非常重要。

二、算法的概念和特征算法是指在有限的时间内解决特定问题的一种方法。

它具有以下特征:输入、输出、确定性、有穷性和可行性。

输入是指算法接受的问题的数据或信息,输出是指算法求解得到的问题的解。

确定性是指算法在任何情况下都能够得到相同的结果。

有穷性是指算法在执行有限的步骤后能够终止。

可行性是指算法的每一步都是可行的,即能够被计算机执行。

三、算法的效率和复杂度算法的效率是指算法解决问题所需要的时间和空间资源的多少。

算法的复杂度是用来描述算法执行过程中所需要的资源的多少。

常用的算法复杂度表示方法有时间复杂度和空间复杂度。

时间复杂度表示算法的执行时间与输入规模之间的关系,用大写O表示。

空间复杂度表示算法所需的空间资源与输入规模之间的关系,用大写S表示。

四、常用的排序算法及性能与复杂度分析1.插入排序插入排序是一种简单直观的排序算法。

它的基本思想是将未排序的元素逐个插入到已排序的序列中。

插入的过程中,需要比较和移动元素的次数与未排序序列中的元素个数相关,因此时间复杂度为O(n^2)。

空间复杂度为O(1)。

2.冒泡排序冒泡排序是一种重复比较相邻元素并交换位置的排序算法。

它的基本思想是两两比较相邻元素,如果顺序错误则交换位置。

冒泡的过程中,需要进行n-1次的比较和交换操作,因此时间复杂度为O(n^2)。

算法分析与设计(线下作业二)

算法分析与设计(线下作业二)

算法分析与设计(线下作业⼆)《算法分析与设计》学习中⼼:专业:学号:姓名:作业练习⼆⼀、名词解释1、MST性质2、⼦问题的重叠性质递归算法求解问题时,每次产⽣的⼦问题并不总是新问题,有些⼦问题被反复计算多次,这种性质称为⼦问题的重叠性质。

⼆、简答题1、简述动态规划算法求解的基本要素。

答:动态规划算法求解的基本要素包括:1)最优⼦结构是问题能⽤动态规划算法求解的前提;2)动态规划算法,对每⼀个⼦问题只解⼀次,⽽后将其解保存在⼀个表格中,当再次需要解此⼦问题时,只是简单地⽤常数时间查看⼀下结果,即重叠⼦问题。

2、备忘录⽅法和动态规划算法相⽐有何异同简述之。

答:备忘录⽅法是动态规划算法的变形。

与动态规划算法⼀样,备忘录⽅法⽤表格保存已解决的⼦问题的答案,在下次需要解此问题时,只要简单地查看该⼦问题的解答,⽽不必重新计算。

备忘录⽅法与动态规划算法不同的是,备忘录⽅法的递归⽅式是⾃顶向下的,⽽动态规划算法则是⾃底向上递归的。

因此,备忘录⽅法的控制结构与直接递归⽅法的控制结构相同,区别在于备忘录⽅法为每个解过的⼦问题建⽴了备忘录以备需要时查看,避免了相同的⼦问题的重复求解,⽽直接递归⽅法没有此功能。

3、贪⼼算法求解的问题主要具有哪些性质简述之。

答:贪⼼算法求解的问题⼀般具有⼆个重要的性质:⼀是贪⼼选择性质,这是贪⼼算法可⾏的第⼀个基本要素;另⼀个是最优⼦结构性质,问题的最优⼦结构性质是该问题可⽤贪⼼算法求解的关键特征。

三、算法编写及算法应⽤分析题1、设计求解如下最⼤⼦段和问题的动态规划算法。

只需给出其递推计算公式即可。

最⼤⼦段和问题:给定由n 个整数(可能为负整数)组成的序列a1a2 … an,求该序列形如Σi≤k≤j ak的⼦段和的最⼤值。

当所有整数均为负整数时定义其最⼤⼦段和为0。

依次定义,所求的最优值为max{0, max1≤i≤j≤n Σi≤k≤j ak }。

2、关于多段图问题。

设G =(V ,E)是⼀个赋权有向图,其顶点集V 被划分成k>2个不相交的⼦集V i :1i k ≤≤,其中,V 1和V k 分别只有⼀个顶点s (称为源)和⼀个顶点t (称为汇),图中所有的边(u,v ),i u V ∈,1i v V +∈。

算法分析与设计作业及参考答案样本

算法分析与设计作业及参考答案样本

《算法分析与设计》作业( 一)本课程作业由两部分组成。

第一部分为”客观题部分”, 由15个选择题组成, 每题1分, 共15分。

第二部分为”主观题部分”,由简答题和论述题组成, 共15分。

作业总分30分, 将作为平时成绩记入课程总成绩。

客观题部分:一、选择题( 每题1分, 共15题)1、递归算法: ( C )A、直接调用自身B、间接调用自身C、直接或间接调用自身 D、不调用自身2、分治法的基本思想是将一个规模为n的问题分解为k个规模较小的字问题, 这些子问题: ( D )A、相互独立B、与原问题相同C、相互依赖D、相互独立且与原问题相同3、备忘录方法的递归方式是:( C )A、自顶向下B、自底向上C、和动态规划算法相同D、非递归的4、回溯法的求解目标是找出解空间中满足约束条件的:( A )A、所有解B、一些解C、极大解D、极小解5、贪心算法和动态规划算法共有特点是: ( A )A、最优子结构B、重叠子问题C、贪心选择D、形函数6、哈夫曼编码是: ( B)A、定长编码B、变长编码C、随机编码D、定长或变长编码7、多机调度的贪心策略是: ( A)A、最长处理时间作业优先B、最短处理时间作业优先C、随机调度D、最优调度8、程序能够不满足如下性质: ( D )A、零个或多个外部输入B、至少一个输出C、指令的确定性D、指令的有限性9、用分治法设计出的程序一般是: ( A )A、递归算法B、动态规划算法C、贪心算法D、回溯法10、采用动态规划算法分解得到的子问题:( C )A、相互独立B、与原问题相同C、相互依赖D、相互独立且与原问题相同11、回溯法搜索解空间的方法是: ( A )A、深度优先B、广度优先C、最小耗费优先D、随机搜索12、拉斯维加斯算法的一个显著特征是它所做的随机选性决策有可能导致算法: ( C )A、所需时间变化B、一定找到解C、找不到所需的解D、性能变差13、贪心算法能得到: ( C )A、全局最优解B、 0-1背包问题的解C、背包问题的解 D、无解14、能求解单源最短路径问题的算法是: ( A )A、分支限界法B、动态规划C、线形规划D、蒙特卡罗算法15、快速排序算法和线性时间选择算法的随机化版本是:( A )A、舍伍德算法B、蒙特卡罗算法C、拉斯维加斯算法D、数值随机化算法主观题部分:二、写出下列程序的答案( 每题2.5分, 共2题)1、请写出批处理作业调度的回溯算法。

《算法分析与设计》期末试题及参考答案

《算法分析与设计》期末试题及参考答案

《算法分析与设计》期末试题及参考答案一、简要回答下列问题:1.算法重要特性是什么?2.算法分析的目的是什么?3.算法的时间复杂性与问题的什么因素相关?4.算法的渐进时间复杂性的含义?5.最坏情况下的时间复杂性和平均时间复杂性有什么不同?6.简述二分检索(折半查找)算法的基本过程。

7.背包问题的目标函数和贪心算法最优化量度相同吗?8.采用回溯法求解的问题,其解如何表示?有什么规定?9.回溯法的搜索特点是什么?10.n皇后问题回溯算法的判别函数place的基本流程是什么?11.为什么用分治法设计的算法一般有递归调用?12.为什么要分析最坏情况下的算法时间复杂性?13.简述渐进时间复杂性上界的定义。

14.二分检索算法最多的比较次数?15.快速排序算法最坏情况下需要多少次比较运算?16.贪心算法的基本思想?17.回溯法的解(x1,x2,……x n)的隐约束一般指什么?18.阐述归并排序的分治思路。

19.快速排序的基本思想是什么。

20.什么是直接递归和间接递归?消除递归一般要用到什么数据结构?21.什么是哈密顿环问题?22.用回溯法求解哈密顿环,如何定义判定函数?23.请写出prim算法的基本思想。

二、复杂性分析1、MERGESORT(low,high)if low<high;then mid←(low,high)/2;MERGESORT(low,mid);MERGESORT(mid+1,high);MERGE(low,mid,high);endifend MERGESORT2、procedure S1(P,W,M,X,n)i←1; a←0while i≤ n doif W(i)>M then return endifa←a+ii←i+1 ;repeatend3.procedure PARTITION(m,p)Integer m,p,i;global A(m:p-1)v←A(m);i←mlooploop i←i+1 until A(i) ≥v repeatloop p←p-1 until A(p) ≤v repeatif i<pthen call INTERCHANGE(A(i),A(p))else exitendifrepeatA(m) ←A(p);A(p) ←vEnd PARTITION4.procedure F1(n)if n<2 then return(1)else return(F2(2,n,1,1))endifend F1procedure F2(i,n,x,y)if i≤nthen call F2(i+1,n,y,x+y)endifreturn(y)end F25.procedure MAX(A,n,j)xmax←A(1);j←1for i←2 to n doif A(i)>xmax then xmax←A(i); j←i;endif repeatend MAX6.procedure BINSRCH(A,n,x,j)integer low,high,mid,j,n;low←1;high←nwhile low≤high domid←|_(low+high)/2_|case:x<A(mid):high←mid-1:x>A(mid):low←mid+1:else:j ←mid; returnendcase repeat j ←0 end BINSRCH三、算法理解1、写出多段图最短路经动态规划算法求解下列实例的过程,并求出最优值。

东北师范大学2020年5月课程考试(网考)《算法分析与设计》参考答案题库汇总奥鹏

东北师范大学2020年5月课程考试(网考)《算法分析与设计》参考答案题库汇总奥鹏

东北师范大学2020年5月课程考试(网考)《算法分析与设计》参考答案题库汇总奥鹏最新东北师范大学《算法分析与设计》网考参考试题汇总标准答案1.陈述算法在最坏情况下的时间复杂度和平均时间复杂度;这两种评估算法复杂性的方法各自有什么实际意义?答最坏情况下的时间复杂度称最坏时间复杂度。

一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度。

这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,这就保证了算法的运行时间不会比任何更长。

平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,算法的期望运行时间。

1. 简单选择排序算法在最好情况下的时间复杂度为O(N)。

A. 错误B. 正确【答案】A2. 若需在O(nlog2n)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是()。

A. 快速排序B. 堆排序C. 归并排序D. 直接插入排序【答案】C3. 求n的阶乘的表示方法n!=n*(n-1)! ,其中0!=1,对应的是递归的思想。

A. 错误B. 正确【答案】B4. 一个算法的评价只要考虑时间复杂度。

A. 错误B. 正确【答案】A5. 十进制的123,1的位权是()。

A. 1B. 2C. 10D. 100【答案】D6. 栈和队列都是线性结构。

A. 错误B. 正确【答案】B7. 高精度计算时可以用数组来存储运算结果。

A. 错误B. 正确【答案】B8. 下列叙述中正确的是()A. 数据的逻辑结构与存储结构必定是一一对应的B. 由于计算机在存储空间上是向量式的存储结构,因此,利用数组只能处理线性结构C. 程序设计语言中的数组一般是顺序存储结构,因此,利用数组只能处理线性结构D. 以上说法都不对【答案】D9. 按F5开始调试,程序便会直接运行到断点处。

接下来可以逐行来运行程序,查看各个变量的值,也可以直接运行到下一个断点或程序结束,这样过程被称作()。

A. 设置断点B. 单步调试C. 程序编译D. 程序调试【答案】B。

算法设计与分析2

算法设计与分析2

由复此杂可度T得分(:n析) TC(CCn7112)T11=1(OnCC(/n12O2223))A(1)1O1没AAB12(11有n121改)AA122进2nnBBA12221112
B12
B22
B21
C12 A11 B12 A12 B22
C21 A21 B11 A22 B21
C22 A21 B12 A22 B22
M 4 A22 (B21 B11 )
M 5 ( A11 A22 )( B11 B22 )
M 6 ( A12 A22 )( B21 B22 )
M 7 ( A11 A21 )( B11 B12 )
A12 B11 B12
A22 B21
B22
C11 M 5 M 4 M 2 M 6 C12 M1 M 2 C21 M 3 M 4 C22 M 5 M1 M 3 M 7
分治法解决问题的步骤
➢ 利用分治法求解问题的算法通常包含如下几个步骤:
✓ ① 分解(Divide) 将原问题分解为若干个相互独立、规模较小且与原问题形式相同 的一系列子问题。
原问题应该分为多少个子问题才较适宜?各个子问题的规模应该怎样 才为适当? 这些问题很难存在一个统一的答案。 实践证明,在用分治法设计算法时,最好使各子问题的规模大致相同。
若依此定义来计算A和B的乘积矩阵C,则每计算C的一 个元素C[i][j],需要做n次乘法和n-1次加法。因此, 算出矩阵C的个元素所需的计算时间为O(n3)
Strassen矩阵乘法
➢ 算法实现:
✓ 传统方法:算法的时间复杂度 T N O N3
✓ 分治法:
将矩阵A,B和C中每一矩阵都分块成4个大小相等的子矩阵。 由此可将方程C=AB重写为:
a11 a12

《算法分析与设计》课后作业

《算法分析与设计》各章课后作业第一章 课后作业1. 设某算法在输入规模为n 时的计算时间为T(n)=10*2n。

若在甲台计算机上实现并完成该算法的时间为t 秒,现有一台运行速度是甲的64倍的另一台计算机乙,问在乙计算机上用同一算法在t 秒内能解决的问题的规模是多大?2.按照渐近阶从低到高的顺序排列以下表达式:4n 2,logn ,3n,20n ,2,n 2/3。

又n!应该排在哪一位?第二章 课后作业1. 用展开法求解下列递推关系:T(n)=⎩⎨⎧>+=1n )()2/(20n )1(n O n T O,写出T(n)的大O 记号表示。

2. 下面是实现在a[0]<=a[1]<=…<=a[n-1]中搜索x 的二分搜索算法,请根据二分 搜索技术在下划线处填充语句。

算法描述如下: template<class Type>public static int BinarySearch(int []a, int x, int n) { //在a[0]<=a[1]<=…<=a[n-1]中搜索 x // 找到x 时返回其在数组中的位置,否则返回-1 int left = 0; int right = n - 1; while ( ) {int middle = ;if(x == a[middle]) return ; if(x > a[middle]) left = middle + 1; else right= ; }return -1; // 未找到x}第三章课后作业1、选择题。

(1)下列算法中通常以自底向上的方式求解最优解的是()。

A、备忘录法B、动态规划法C、贪心法D、回溯法(2)备忘录方法是那种算法的变形。

()A、分治法B、动态规划法C、贪心法D、回溯法(3)矩阵连乘问题的算法可由()设计实现。

A、分支界限算法B、动态规划算法C、贪心算法D、回溯算法2.计算题。

算法分析与设计_山东财经大学中国大学mooc课后章节答案期末考试题库2023年

算法分析与设计_山东财经大学中国大学mooc课后章节答案期末考试题库2023年1.蒙特卡罗算法的结果未必正确,并且可能难以有效判定是否正确。

答案:正确2.T(n) = T(n-1) + 1, T(1)=1,则 T(n) =Q(___)答案:n3.木板问题:农夫约翰为了修理栅栏,将一块木板切割成N块,N块的长度和=原木板长度。

每次切割木板时的开销为该木板的长度。

木板长15,切成长为1、 2 、3 、 4 、5的木板。

如何切割,使开销最小? (1) 该问题最好使用()算法求解。

A 枚举B 贪心C 分治D 递推(2)第一次切割成长度为_____和_____的两块。

(3) 切割的策略和_____算法相同。

A MSTB 区间调度C 哈夫曼D 区间划分答案:B;6;9;C4.背包问题,背包容量C=20 ,物品价值p =[4, 8,15, 1, 6,3], 物品重量w=[5, 3,2, 10, 4, 8],如果是0-1背包问题,求装入背包的最大价值和相应装入物品。

(1)该问题最好使用()算法求解?A 动态规划算法B 贪心算法C 枚举算法D 分治算法(2)装入背包的最大价值是_____,(3)最大价值对应的物品编号为____、____、____、____。

(从小到大)答案:A;33;1;2;3;55.动态规划方程M[i]=min(M[j]+wij), 1≤i≤j≤n, 则算法的时间复杂度为n^2答案:正确6.给定二分图G = 中无孤立点,|V|=n,其最大流算法求得最大流f, 则 G的最大独立数=n-f答案:正确7.旅行商问题的所有解,可以组织成一棵树,包含了所有城市的排列组合。

树的根结点到任一叶结点的路径,定义了图的一条周游路线。

答案:正确8.对于问题的一个实例,解向量满足显式约束条件的所有多元组,构成了该实例的一个解空间。

答案:正确9.Floyd算法是动态规划算法,稠密图效果最佳,边权可正可负。

答案:正确10.f=o(g)当且仅当g = ω (f)答案:正确11.预流推进算法的关键操作有()答案:重标号_初始化_推进12.最小费用最大流算法求得解需满足()条件。

算法分析与设计作业及参考答案

算法分析与设计作业及参考答案作业题目1、请分析冒泡排序算法的时间复杂度和空间复杂度,并举例说明其在实际中的应用场景。

2、设计一个算法,用于在一个未排序的整数数组中找到第二大的元素,并分析其时间复杂度。

3、比较贪心算法和动态规划算法的异同,并分别举例说明它们在解决问题中的应用。

参考答案1、冒泡排序算法时间复杂度:冒泡排序的基本思想是通过相邻元素的比较和交换,将最大的元素逐步“浮”到数组的末尾。

在最坏情况下,数组完全逆序,需要进行 n 1 轮比较和交换,每一轮比较 n i 次(i 表示当前轮数),所以总的比较次数为 n(n 1) / 2,时间复杂度为 O(n^2)。

在最好情况下,数组已经有序,只需要进行一轮比较,时间复杂度为 O(n)。

平均情况下,时间复杂度也为 O(n^2)。

空间复杂度:冒泡排序只在原数组上进行操作,不需要额外的存储空间,空间复杂度为 O(1)。

应用场景:冒泡排序算法简单易懂,对于规模较小的数组,或者对算法的简单性要求较高而对性能要求不是特别苛刻的场景,如对少量数据进行简单排序时,可以使用冒泡排序。

例如,在一个小型的学生成绩管理系统中,需要对一个班级的少量学生成绩进行排序展示,冒泡排序就可以满足需求。

2、找到第二大元素的算法以下是一种使用遍历的方法来找到未排序整数数组中第二大元素的算法:```pythondef find_second_largest(arr):largest = arr0second_largest = float('inf')for num in arr:if num > largest:second_largest = largestlargest = numelif num > second_largest and num!= largest:second_largest = numreturn second_largest```时间复杂度分析:这个算法需要遍历数组一次,所以时间复杂度为O(n)。

算法分析与设计(李清勇)课后习题答案

算法分析与设计(李清勇)课后习题答案5-1凸多边形最优三⾓剖分问题//3d5 凸多边形最优三⾓剖分#include "stdafx.h"#includeusing namespace std;constint N = 7;//凸多边形边数+1int weight[][N] = {{0,2,2,3,1,4},{2,0,1,5,2,3},{2,1,0,2,1,4},{3,5,2,0,6,2},{1,2,1,6,0,1},{4,3,4,2,1,0}};//凸多边形的权intMinWeightTriangulation(intn,int **t,int **s);void Traceback(inti,intj,int **s);//构造最优解int Weight(inta,intb,int c);//权函数int main(){int **s = new int *[N];int **t = new int *[N];for(inti=0;is[i] = new int[N];t[i] = new int[N];}cout<<"此多边形的最优三⾓剖分值为:"<cout<<"最优三⾓剖分结构为:"<Traceback(1,5,s); //s[i][j]记录了Vi-1和Vj构成三⾓形的第3个顶点的位置return 0;}intMinWeightTriangulation(intn,int **t,int **s){for(inti=1; i<=n; i++){t[i][i] = 0;}for(int r=2; r<=n; r++) //r为当前计算的链长(⼦问题规模){for(inti=1; i<=n-r+1; i++)//n-r+1为最后⼀个r链的前边界{int j = i+r-1;//计算前边界为r,链长为r的链的后边界t[i][j] = t[i+1][j] + Weight(i-1,i,j);//将链ij划分为A(i) * ( A[i+1:j] )这⾥实际上就是k=i s[i][j] = i; for(int k=i+1; k//将链ij划分为( A[i:k] )* (A[k+1:j])int u = t[i][k] + t[k+1][j] + Weight(i-1,k,j);if(ut[i][j] = u;s[i][j] = k;}}}}return t[1][N-2];}voidTraceback(inti,intj,int **s){if(i==j) return;Traceback(i,s[i][j],s);Traceback(s[i][j]+1,j,s);cout<<"三⾓剖分顶点:V"<int Weight(inta,intb,int c){return weight[a][b] + weight[b][c] + weight[a][c];}5-4 数字三⾓形最短路径5-2 游艇租赁问题#includeusing namespace std;#define N 210int cost[N][N];int m[N];int main(){intn,i,j;while(cin>>n){for(i=1;ifor(j=i+1;j<=n;j++)cin>>cost[i][j];m[1]=0;int min;for(i=2;i<=n;i++){min=cost[1][i];for(j=1;j<=i-1;j++){if(cost[j][i]!=0 && m[j]+cost[j][i]min=m[j]+cost[j][i];}m[i]=min;}cout<}return 0;}5-6 合唱队形问题#include/doc/d0aa713f51e79b8969022686.html ing namespace std; 2.3.//⽤于保存⼦问题最优解的备忘录4.typedef struct5.{6.int maxlen; //当前⼦问题最优解7.int prev; //构造该⼦问题所⽤到的下⼀级⼦问题序号(⽤于跟踪输出最优队列)8.}Memo;9.10.//⽤于递归输出Memo B中的解11.void Display(int* A, Memo* M, int i)12.{13.if (M[i].prev == -1)14. {15. cout<16.return;17. }18. Display(A, M, M[i].prev);19. cout<20.}21.22.//算法主要部分23.void GetBestQuence(int* A, int n)24.{25.//定义备忘录并作必要的初始化26. Memo *B = new Memo[n]; //B[i]代表从A[0]到A[i]满⾜升序剔除部分元素后能得到的最多元素个数27. Memo *C = new Memo[n]; //C[i]代表从A[i]到A[n-1]满⾜降序剔除部分元素后能得到的最多元素个数28. B[0].maxlen = 1; //由于B[i]由前向后构造初始化最前⾯的⼦问题 (元素本⾝就是⼀个满⾜升序降序的序列)29. C[n-1].maxlen = 1; //同样C[i]由后向前构造30.for (int i=0; i31.//⽤于在跟踪路径时终⽌递归或迭代(因为我们并不知道最终队列从哪⾥开始)32. {33. B[i].prev = -1;34. C[i].prev = -1;35. }36.37.for (i=1; i38. {39.int max=1;40.for (int j=i-1; j>=0; j--) //查看前⾯的⼦问题找出满⾜条件的最优解并且记录41. {42.if (A[j]max)43. {44. max = B[j].maxlen+1; //跟踪当前最优解45. B[i].prev = j; //跟踪构造路径46. }47. }48. B[i].maxlen = max; //构造最优解49. }50.51.for (i=n-1; i>0; i--)52. {53.int max=1;54.for (int j=i; j解时可以直接⽤B[i]+C[i]-155.//否则我们得到的最优解始终为B[n-1]+C[n-1]56. {57.if (A[j]max) //⽐当前长度更长记录并构造58. {59. max = C[j].maxlen+1;60. C[i].prev = j;61. }62. }63. C[i].maxlen = max;64. }65.66.//遍历i 得到最⼤的B[i]+C[i]-1(-1是因为我们在B[i]和C[i]中均加上了A[i]这个数因此需要减去重复的)67.int maxQuence = 0; //记录当前最优解68.int MostTall; //记录i ⽤于跟踪构造路径69.for (i=0; i70. {71.if (B[i].maxlen+C[i].maxlen-1 > maxQuence)72. {73. maxQuence = B[i].maxlen+C[i].maxlen-1;74. MostTall = i;75. }76. }77.78. cout<<"最⼤合唱队形长度: "<79.80.//B由前向后构造因此prev指向前⾯的元素需要递归输出81. Display( A, B, MostTall);82.//C的prev指向后⾯元素直接迭代输出83.while (C[MostTall].prev != -1)84. {85. MostTall = C[MostTall].prev;86. cout<87. }88. cout<89.90.delete []B;91.delete []C;92.}93.int main()94.{95.//测试96.int *A;97.int n;98. cout<<"请输⼊合唱队员个数: "<99. cin>>n;100.101. A = new int[n];102. cout<<"输⼊队员⾝⾼ :"<103.for (int i=0; i104. {105. cin>>A[i];106. }107. GetBestQuence(A, n);108.delete []A;109.return 0;110.}5-7买票问题状态转移⽅程是f[i] := min(f[i - 1] + t[i], f[i - 2] + r[i - 1]); {i = 2 ~ n} 初值f[0] := 0; f[1] := t[1]; constmaxn = 1000;vari, j, n : longint;f, t, r : array[0..maxn] of longint;function min(a, b : longint) : longint;begin if a < b then exit(a); exit(b); end;beginreadln(n);for i := 1 to n do read(t[i]);for i := 1 to n - 1 do read(r[i]);f[0] := 0; f[1] := t[1];for i := 2 to n dof[i] := min(f[i - 1] + t[i], f[i - 2] + r[i - 1]);writeln(f[n]);end.伪代码BuyTicks(T, R)1n ← length[T]2f[0] ← 03f[1] ← T[1]4for i ← 2to n do5f[i] ← f[i-2]+R[i-1]6if f[i] > f[i-1]+T[i] then7f[i] ← f[i-1]+T[i]8return f5-8最⼤⼦段和问题#include#includeintmax_sum(intn,int *a,int *besti,int *bestj){ int *b = (int *)malloc(n * sizeof(int));int sum = 0;int i = -1;int temp = 0;for (i=0;i<=n-1;i++) {if (temp > 0)temp += a[i];elsetemp = a[i];b[i] = temp;}sum = b[0];for (i=1;i<=n-1;i++) {if (sum < b[i]) {sum = b[i];*bestj = i;}}for (i = *bestj;i>= 0;i--) {if (b[i] == a[i]) {*besti = i;break;}}free(b);return sum;}int main(void){int a[] = {-2,1,-4,13,-5,-2,-10,20,100};int length = sizeof(a)/sizeof(int);intbesti = -1;intbestj = -1;sum = max_sum(length,a,&besti,&bestj);printf("besti = %d,bestj = %d,max_sum=%d\n",besti,bestj,sum); return 0;}5-9 装箱问题发现就是0-1背包问题每个物品的体积就是花费同时也是价值,也就是说这题可以转化为在总体积为w下,可以得到最⼤的价值最后⽤总体积减去最⼤的价值就是剩下最少的空间状态转移⽅程d[j] = max(d[j], d[j - a[i]] + a[i]);第⼆⾏为⼀个整数,表⽰有n个物品;接下来n⾏,每⾏⼀个整数表⽰这n个物品的各⾃体积。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《算法分析与设计》
学习中心:
专业:
学号:
姓名:
作业练习二
一、名词解释
1、MST性质
2、子问题的重叠性质
递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次,这种性质称为子问题的重叠性质。

二、简答题
1、简述动态规划算法求解的基本要素。

答:动态规划算法求解的基本要素包括:
1)最优子结构是问题能用动态规划算法求解的前提;
2)动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果,即重叠子问题。

2、备忘录方法和动态规划算法相比有何异同简述之。

答:备忘录方法是动态规划算法的变形。

与动态规划算法一样,备忘录方法用表格保存已解决的子问题的答案,在下次需要解此问题时,只要简单地查看该子问题的解答,而不必重新计算。

备忘录方法与动态规划算法不同的是,备忘录方法的递归方式是自顶向下的,而动态规划算法则是自底向上递归的。

因此,备忘录方法的控制结构与直接递归方法的控制结构相同,区别在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相同的子问题的重复求解,而直接递归方法没有此功能。

3、贪心算法求解的问题主要具有哪些性质简述之。

答:贪心算法求解的问题一般具有二个重要的性质:
一是贪心选择性质,这是贪心算法可行的第一个基本要素;
另一个是最优子结构性质,问题的最优子结构性质是该问题可用贪心算法求解的关键特征。

三、算法编写及算法应用分析题
1、设计求解如下最大子段和问题的动态规划算法。

只需给出其递推计算公式即可。

最大子段和问题:给定由n 个整数(可能为负整数)组成的序列a1a2 … an,求该序列形如Σi≤k≤j ak的子段和的最大值。

当所有整数均为负整数时定义其最大子段和为0。

依次定义,所求的最优值为max{0, max1≤i≤j≤n Σi≤k≤j ak }。

2、关于多段图问题。

设G =(V ,E)是一个赋权有向图,其顶点集V 被划分成k>2个不相交的子集V i :1i k ≤≤,其中,V 1和V k 分别只有一个顶点s (称为源)和一个顶点t (称为汇),图中所有的边(u,v ),i u V ∈,1i v V +∈。

求由s 到t 的最小成本路径。

① 给出使用动态规划算法求解多段图问题的基本思想。

② 使用上述方法求解如下多段图问题。

s t
V1V2V3V4V5
3、最优二元归并问题:已知将两个分别包含a 个和b 个记录的已分类文件归并在一起得到一个分类文件需作a+b 次记录移动。

现有n 个已分类文件F1,F1,⋯,Fn,它们的记录个数分别为l1, l2,⋯, ln。

现在考虑使用二元归并模式将这n 个文件归并成一个分类文件,要求记录移动次数最少。

设计一个贪心算法来求解一种最优的二元归并(即记录移动次数最少的二元归并)。

4、带限期的作业调度问题:n 个作业需要在一台机器上处理,每个作业可在单位时间内完
成。

每个作业i 都有一个截止期限di>0(di 为整数),当且仅当作业i 在它的截止期限之前被完成,获得pi>0 的效益。

一种可行的调度方案为n 个作业的一个子集J,其中J 中的每个作业都能在各自的截止期限内完成。

该可行调度方案的效益是J 中作业的效益之和。

试设计贪心算法求效益最大的可行调度方案(即最优调度方案)。

相关文档
最新文档