ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:395.46KB ,
资源ID:4312871      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4312871.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法实验二题库二.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法实验二题库二.docx

1、算法实验二题库二南通大学算法设计与分析实验报告 姓 名: 鹿 瑶 班 级: 软件工程 122 学 号: 1213042037 日 期: 2014 . 12 . 16 目录Question-2编程实现循环赛日程表(分治法) 3Question-3编程实现最长公共子序列(动态规划) 3Question-4 The Triangle(动态规划)4Question-5超级台阶(动态规划) 5Question-6最大和(动态规划) 6Question-7 剑客决斗(动态规划)7Question-8最长上升子序列问题(动态规划) 8Question-9独木舟上的旅行(贪婪法) 9Question-10背包

2、问题(贪心算法) 10Question-11田忌赛马(动规中的贪心算法) 10Question-12硬币问题(贪心算法) 11附:源代码12Question-2编程实现循环赛日程表(分治法)描述设有 n=2 k 个运动员要进行网球循环赛,先要设计一个满足一下要求的比赛日常表:(1)每个选手必须与其他 n-1 个选手各赛一次(2)每个选手一天只能赛一次(3)循环赛一共进行 n-1 天算法设计将n*n个格子,也就是n阶方阵从中间十字划分,一次划分分成四块,令其右上角和左下角的数据完全相同,右下角和左上角的数据完全相同;每次划分都得到了若干个n/2阶的方阵,然后对这些方阵进行操作,继续令其右上角和左

3、下角的数据完全相同,右下角和左上角的数据完全相同,如此循环下去,直至n2时结束递归。运行结果Question-3编程实现最长公共子序列(动态规划)描述如题,需要你做的就是写一个程序,得出最长公共子序列。tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为 LCS(Longest CommonSubsequence) 。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。输入第一行给出一个整数 N(0N100)表示待测数据组数接下来每组数据两行,分别为待测的两组字符串。每个字符串长度不大于 1000.

4、算法设计由最长公共子序列问题的最优子结构性质可知,要找出X=和Y=的最长公共子序列,可按以下方式递归地进行:当xm=yn时,找出Xm-1和Yn-1的最长公共子序列,然后在其尾部加上xm(=yn)即可得X和Y的一个最长公共子序列。当xmyn时,必须解两个子问题,即找出Xm-1和Y的一个最长公共子序列及X和Yn-1的一个最长公共子序列。这两个公共子序列中较长者即为X和Y的一个最长公共子序列。由此递归结构容易看到最长公共子序列问题具有子问题重叠性质。例如,在计算X和Y的最长公共子序列时,可能要计算出X和Yn-1及Xm-1和Y的最长公共子序列。而这两个子问题都包含一个公共子问题,即计算Xm-1和Yn-

5、1的最长公共子序列。与矩阵连乘积最优计算次序问题类似,我们来建立子问题的最优值的递归关系。用ci,j记录序列Xi和Yj的最长公共子序列的长度。其中Xi=,Yj=。当i=0或j=0时,空序列是Xi和Yj的最长公共子序列,故ci,j=0。其他情况下,由定理可建立递归关系如下:运行结果:Question-4 The Triangle (动态规划)描述73 88 1 02 7 4 44 5 2 6 5在上图所示的三角形中,从顶部到底部,找一条路线,使得它的和最大。当然,每一步只能走左下或者右下。算法分析利用动态规划的基本步骤来分析,首先找出最优解结构,li表示1到i层路径的最优解,则li-1亦为最优解

6、(证明:如果li-1不为最优解,则1到i-1层有另外一条路径使得li-1为最优解,这样就会致使li路径不为最优解,矛盾)。最优解结构:这里用一位数组存储数字三角形。运行结果Question-5超级台阶 (动态规划)描述有一楼梯共 m 级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第 m 级,共有多少走法?注:规定从一级到一级有 0 种走法。输入输入数据首先包含一个整数 n(1=n=100),表示测试实例的个数,然后是 n 行数据,每行包含一个整数 m, (1=m=40), 表示楼梯的级数。输出对于每个测试实例,请输出不同走法的数量。 (即有两个不同的楼梯,一个楼梯有 2 级,一个楼梯

7、有 3 级)算法设计只能说这题有一点DP的思想。简单递归运行结果Question-6最大和 (动态规划)描述给定一个由整数组成二维矩阵(r*c) ,现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。例子:0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2其最大子矩阵为:9 2-4 1-1 8其元素总和为 15。输入第一行输入一个整数 n(0n=100),表示有 n 组测试数据;每组测试数据:第一行有两个的整数 r,c(0r,c=100) ,r、c 分别代表矩阵的行和列;随后有 r 行,每行有 c 个整数;输出输出矩阵的最大子矩阵的

8、元素之和。算法分析用2 维数组a1 :m1 :n表示给定的m行n列的整数矩阵。子数组ai1: i2j1: j2表示左上角和右下角行列坐标分别为(i1, j1)和(i2, j2)的子矩阵,其各元素之和记为:(1)最大子矩阵和问题的最优解即为:(2)(3)如果令:(4)那么式(4)就是我们熟悉的最大子序列和的问题。根据以上分析我们可得到最大子矩阵和问题的算法:运行结果Question-7 剑客决斗 (动态规划)描述在路易十三和红衣主教黎塞留当权的时代, 发生了一场决斗。 n 个人站成一个圈, 依次抽签。抽中的人和他右边的人决斗,负者出圈。这场决斗的最终结果关键取决于决斗的顺序。现书籍任意两决斗中谁

9、能胜出的信息,但“A 赢了 B”这种关系没有传递性。例如,A 比 B 强,B比 C 强,C 比 A 强。如果 A 和 B 先决斗,C 最终会赢,但如果 B 和 C 决斗在先,则最后 A会赢。显然,他们三人中的第一场决斗直接影响最终结果。假设现在 n 个人围成一个圈,按顺序编上编号 1n。一共进行 n-1 场决斗。第一场,其中一人(设 i 号)和他右边的人(即 i+1 号,若 i=n,其右边人则为 1 号) 。负者被淘汰出圈外,由他旁边的人补上他的位置。已知 n 个人之间的强弱关系(即任意两个人之间输赢关系) 。如果存在一种抽签方式使第 k 个人可能胜出, 则我们说第 k 人有可能胜出, 我们的

10、任务是根据 n 个人的强弱关系,判断可能胜出的人数。输入第一行是一个整数 N(1=N=20)表示测试数据的组数。第二行是一个整数 n 表示决斗的总人数。(2=n=500)随后的 n 行是一个 n 行 n 列的矩阵,矩阵中的第 i 行第 j 列如果为 1 表示第 i 个人与第 j 个人决斗时第 i 个人会胜出,为 0 则表示第 i 个人与第 j 个人决斗时第 i 个人会失败。输出对于每组测试数据,输出可能胜出的人数,每组输出占一行。算法设计动态规划(弗洛伊德),可以把一圈人从x分为两端都是x的一条线,x向中间打若最终x能遇到x则说明x可以取得胜利, 中间得到meetij的转移方程有点像弗洛伊德算

11、法, 从中间找可以作为媒介的点, 然后更新meet数组。因为是在圈里所以要注意%操作。运行结果Question-8最长上升子序列问题 (动态规划)描述有一个长为 n 的数列 a0,a1,an-1。请求出这个序列中最长的上升子序列的长度。上升子序列指的是对于任意的 ij 都满足 aiaj 的子序列。 (1n1000,0ai1000000) 。输入第一行为 n,下面一行为 a0an-1。输出最长上升子序列的长度。算法设计我们依次遍历整个序列,每一次求出从第一个数到当前这个数的最长上升子序列,直至遍历到最后一个数字为止,然后再取dp数组里最大的那个即为整个序列的最长上升子序列。我们用dpi来存放序列

12、1-i的最长上升子序列的长度,那么dpi=max(dpj)+1,(j1, i-1); 显然dp1=1,我们从i=2开始遍历后面的元素即可。运行结果:Question-9独木舟上的旅行 (贪婪法)描述进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别。一条独木舟最多只能乘坐两个人, 且乘客的总重量不能超过独木舟的最大承载量。 我们要尽量减少这次活动中的花销,所以要找出可以安置所有旅客的最少的独木舟条数。现在请写一个程序,读入独木舟的最大承载量、旅客数目和每位旅客的重量。根据给出的规则,计算要安置所有旅客必须的最少的独木舟条数,并输出结果。输入第一行输入 s,表示测试数据的组数;每组

13、数据的第一行包括两个整数 w,n,80=w=200,1=n=300,w 为一条独木舟的最大承载量,n 为人数;接下来的一组数据为每个人的重量(不能大于船的承载量)。输出每组人数所需要的最少独木舟的条数。算法设计先把各个人的体重排序,然后计算最重的人和最轻的人能否同乘一条舟,如果不能,则最重的人就要单独乘坐一条舟,再求最轻的和第二重的人的和,依次比较。运行结果Question-10背包问题(贪心算法)描述现在有很多物品(它们是可以分割的) ,我们知道它们每个物品的单位重量的价值 v 和重量w(1=v,w=10) ;如果给你一个背包它能容纳的重量为 m(10=m=20),你所要做的就是把物品装到背

14、包里,使背包里的物品的价值总和最大。输入第一行输入一个正整数 n(1=n=5),表示有 n 组测试数据;随后有 n 测试数据,每组测试数据的第一行有两个正整数 s,m(1=s=10);s 表示有 s 个物品。接下来的 s 行每行有两个正整数 v,w。输出输出每组测试数据中背包内的物品的价值和,每次输出占一行。算法设计贪心原理,要求背包物品总价值最大,故尽可能多存放价值大的物品;如图 题目中给出的例子, 背包可容纳重量15,故先放价值最大的A,将10斤A全部放入背包,然后放入价值次大的C,此时背包容纳量剩下15-10=5,而C还有9斤,因此剩下的全放C,总价值=(10*5)+(5*3)=65。运

15、行结果Question-11田忌赛马(动规中的贪心算法)描述田忌赛马的故事大家应该都听过吧。田忌经常与齐国众公子赛马,设重金赌注。孙膑发现他们的马脚力都差不多,马可分为上、中、下三等。于是孙膑对田忌说:“您只管下大赌注,我能让您取胜。”田忌相信并答应了他,与齐王和诸公子用千金来赌注。比赛即将开始,孙膑说:“现在用您的下等马对付他们的上等马,拿您的上等马对付他们的中等马, 拿您的中等马对付他们的下等马。 ”已经比了三场比赛, 田忌一场败而两场胜,最终赢得齐王的千金赌注。现在题目的要求是这样的,给出田忌 n 匹马的速度,再给出公子 n 匹马的速度,运用上述思想,求田忌最多能赢几场比赛。 我们规定,

16、赢一场可得200两黄金,输一场就扣200量黄金。平局不得也不扣。求田忌最多能赢多少黄金。输入测试数据有多个。每组测试数据的第一行是为 n 的正整数。(1=n=1000),接下来的两行为马的速度。第一行为田忌的 n 匹马的速度,第二行为公子的 n 匹马的速度。输出对于每一个测试用例,每行输出一个数,该数为田忌所能赢的最多的黄金数。算法设计1 如果田忌的慢马比齐王的慢马快,直接比赛。赢的代价小!2 如果田忌的慢马比齐王的慢马慢,让他和齐王的快马比赛。输的值!3 如果田忌的慢马的速度等于齐王的慢马 1 )如果田忌的快马比齐王的快马快 ,直接比赛。赢! 2 )如果田忌的慢马比齐王的快马慢,那让他和齐王

17、最快的马比赛。输的值! 3 )其他情况,直接退出。统计比赛结果,算钱!运行结果Question-12硬币问题(贪心算法)描述有1元、5元、10元、50元、100元、500元的硬币各 C 1 、C 5 、C 10 、C 50 、C 100 、C 500 枚。现在要用这些硬币来支付 A 元、 最少需要多少枚硬币?假定本题至少存在一种支付方案。输入第一行 n 为测试数据的组数。以下各行依次为:C 1 C 5 C 10 C 50 C 100 C 500 A输出每行输出需要最少的硬币数算法设计由贪心算法可知尽量用大面值的硬币组合来找钱,可以使使用的硬币最少。而贪心算法对最少硬币问题的解决总是可以得到最优

18、解很好的近似解。本算法就是用贪心策略枚举出所有近似最优解,然后从中寻找到问题的最优解寻找近似最优解群。(1)将硬币依面值大小排序(2)按面值种类划分不同情况有多少种面值就划分多少种情况.每种情况的第一枚硬币面值各不一样,其后对剩余的硬币按面值从大到小排列。运行结果附:源代码Question-2#include using namespace std;#define MAX 100/定义每组比赛成员的结构类型typedef struct node int p1; int p2;team;team XMAXMAX/2+1;/X为解向量 xij表示第i天 第j场次现在赛的情况 xij.p1 和xij

19、.p2int num,tMAX;/num表示 比赛人数 t分别表示每天比赛的场次数初始化为0void Init() coutnum; for(int i=0;iMAX;i+)ti=0; void f(int from,int to, int day)/编号为from到to的n(n=to-from+1)个人从第day天开始比赛,全部安排下去的函数 int n=to-from+1,i,k; if(n2) /超过两人,才分成两组 int mid=from+n/2-1; f(from,mid,day); /组内比赛 f(mid+1,to,day); /组内比赛 /以下是组间比赛 for(k=0;k=n

20、/2;k+) /在后n/2天内,分别与组2内队员(j+i+k)%(n/2)进行组间比赛 for(i=0;i=n/2;i+) Xn/2+k+tn/2+k.p1 = from+i; Xn/2+ktn/2+k.p2 = (i+k)%(n/2+1)+mid+1; void Output() cout比赛安排如下:n; for(int i=1;i=num;i+) cout第i天:endl; for(int j=1;j=ti;j+) coutj:(Xij.p1,Xij.p2) ; coutendl; int main() int z; Init();/初始化 f(1,num,1);/从1到num个人 从第

21、一天开始 调用函数 Output(); coutz; return 0;Question-3#include#include#define N 100using namespace std;int aNN;char s1N,s2N;int max(int a,int b) return a=b?a:b;int main() int count,i,j,length1,length2,z; coutcount; while(count-) int count=1; cout请输入第count组待测序列:s1+1s2+1; length1=strlen(s1+1); length2=strlen(

22、s2+1); for(i=0;i=length1;i+) ai0=0; for(i=0;i=length2;i+) a0i=0; for(i=1;i=length1;i+) for(j=1;j=length2;j+) if(s1i=s2j) aij=ai-1j-1+1; else aij=max(ai-1j,aij-1); cout最长公共子序列长度为:alength1length2endlendl; count+; coutz; return 0;Question-4#include#define N 105using namespace std; int aNN,dpNN,z; int m

23、ain() int n,i,j,min; coutn) for(i=1;i=n;i+) for(j=1;jaij; dpij=0; dp11=a11; for(i=2;i=n;i+) dpi1=ai1+dpi-11; for(j=2;jdpi-1j?dpi-1j-1:dpi-1j; dpij=aij+min; int ans=0; for(i=1;i=n;i+) if(ansdpni) ans=dpni; cout自上而下路径最大和为:ansendl;/最大和 coutz; return 0; Question-5#include using namespace std; int main()

24、 int N; coutN; _int64 array1024;memset(array,0,1024); coutsum; array2=1; array1=1; for(int index=3;index=sum;index+) arrayindex=arrayindex-1+arrayindex-2; coutarraysum ; coutendl;system(pause); return 0; Question-6#include#include#include #include using namespace std;int a102102; int main() int i,j,

25、k,m,r,c,max,temp,z,n; coutn; for(int count=0;countn;count+) cout输入第count+1r; coutendl; cout输入第count+1c; for(i=1;i=r;i+) for(j=0;jaij; aij=aij+ai-1j; for(i=1,m=a10;i=r;i+) for(j=i;j=r;j+) for(k=max=0;k=0?max:0)+temp; m=maxm?max:m; cout矩阵的最大和为:mendlendl; coutz; Question-7#include #include #include int fight501501, meet501501, n; /fightij: i与j PK 能否获胜, meetij:i,j能否遇到int main() printf(请输入测试数据的组数和决斗的总人数:n); int i, j, k, m, t, cnt

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1