《算法分析与设计》_实验指导书

合集下载

算法设计与分析实验指导

算法设计与分析实验指导

《算法设计与分析》实验指导书目录实验一单链表的建立插入及删除 (3)实验二多项式加法 (5)实验三集合的表示与操作算法设计 (7)实验四迷宫问题求解 (8)实验五树的建立及遍历 (11)实验六图的遍历的演示 (12)实验七哈希表的设计 (15)实验八Kruskal算法的设计 (17)实验九归并排序的分治策略设计 (19)实验十哈夫曼编码的贪心算法设计 (21)实验十一递归与迭代程序设计 (22)实验十二多段图问题的动态规划算法设计 (24)实验十三作业调度问题 (26)实验十四回溯算法设计 (28)实验十五搜索顺序的选择 (29)实验十六蛇和梯子 (31)实验十七游戏中寻址算法的设计 (34)实验十八旅行商问题 (36)实验十九骑士游历算法设计 (38)实验二十输油管道问题的设计与实现 (40)实验二十一邮局选址问题的设计与实现 (42)实验二十二会场安排问题的设计与实现 (44)实验二十三目录树打印程序的设计 (46)实验二十四最少演员问题 (48)附:实验(设计)报告参考格式 (50)实验一单链表的建立插入及删除[实验目的]1.掌握单链表的建立插入及删除的算法;2.进一步熟悉指针的用法;[预习要求]1.认真阅读教材或参考书, 掌握线性表算法的基本思想;2.写出求解本实验的程序;3.设计好相应的测试用例。

[类型定义]typedef struct Lnode{int data;struct Lnode *next;}Lnode,*linklist;[实验提示]void create(link *h,int n){//创建单链表link p,q;int i;p=(link)malloc(sizeof(node));p->next=null;*h=p;q=p;for(i=1;i<=n;++i){p=(link)malloc(sizeof(node));scanf("%d",&p->data);p->next=null;q->next=p;q=p;}}void print(link h){//输出单链表link p;p=h->next;while(p){printf("%d ",p->data);p=p->next;}}void insertlist(linklist *L,int i,int e){//在单链表的第i个元素之前插入元素值为e的结点}void dellist(linklist *L,int i,int *e){//删除单链表的第i个结点,被删结点通过 e返回}[实验步骤]1.先用插表头或插表尾的方法建立单链表并输出,并测试你的程序,直至正确为止;2.再进行插入和删除程序的设计;3.将你的程序和实录的界面存盘备用。

算法分析与设计A实验指导书_张怡婷2014_

算法分析与设计A实验指导书_张怡婷2014_

//最后一个元素为哨兵∞
} 2、分析这两种排序算法在最好、最坏和平均情况下的时间复杂度。 两路合并排序:最好、最坏、平均情况下的时间复杂度均为 O(nlogn) 。 快速排序:最好、平均情况下的时间复杂度为 O(nlogn) ,最坏情况下为 O(n2 )。 3、当初始序列是递增或递减次序排列时,通过改进主元(基准元素)的选择方法,可以提 高快速排序算法运行的效率,避免最坏情况的发生。 有三种主元选择方式。 一是取 K(left+right)/2 为主元; 二是取 left~right 之间的随机整数 j,以 Kj 作为主元; 三是取 Kleft 、K(left+right)/2 和 Kright 三者的中间值为主元。 试选择其中的一种, 在原程序的基础上修改实现。 下面给出第二种主元选择方式的具体 实现: 随机数的产生是由 srand 函数以 time 函数值(即当前时间)作为种子,rand 函数产生 一个 0-RAND_MAX 范围内的随机数。 因此文件的开头应包含两个头文件 time.h 和 stdlib.h 。 为了不改动原有程序的基本结构,在原有程序上增加一个 RandomizedPartition 函数。 由 QuickSort 先调用该函数,产生一个 left~ right 范围内的随机下标 i,将该下标处的元 素 Kj 和原有的主元 Kleft 交换,然后照常调用原有的 Partition 函数即可。 void SortableList::QuickSort(int left,int right) { 。 。 。 。 。 。 int j=RandomizedPartition(left,right); //调用 RandomizedPartition 函数 。 。 。 。 。 。 } int SortableList::RandomizedPartition(int left, int right) { srand( (unsigned)time(NULL)); int i=rand()%(right-left)+left; Swap(i,left); return Partition(left, right); } //用当前时间作为种子 //产生一个 left~right 范围内的随机数 //调用 Partition 函数

算法分析与设计实验指导书

算法分析与设计实验指导书

《算法分析与设计》实验指导书《算法分析与设计》课程是计算机专业的一门必修课程。

开设算法分析与设计实验,目的就是为了使学生消化理论知识,加深对讲授内容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的分析与设计有更深刻的认识。

《算法分析与设计》课程实验的目的:是为了使学生在课程学习的同时,通过实验环境中的实际操作,对部分算法的具体应用有一个初步的了解,使学生加深了解和更好地掌握《算法分析与设计》课程教学大纲要求的内容。

《算法分析与设计》课程实验的注意事项:在《算法分析与设计》的课程实验过程中,要求学生做到:(1)预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出现的情况提前作出思考和分析。

(2)认真书写实验报告。

实验报告包括实验目的和要求,实验情况及其分析。

(3)遵守机房纪律,服从辅导教师指挥,爱护实验设备。

(4)实验课程不迟到。

如有事不能出席,所缺实验一般不补。

《算法分析与设计》课程实验的验收:实验的验收将分为两个部分。

第一部分是上机操作,包括检查程序运行和即时提问。

第二部分是提交电子的实验报告。

实验一算法实现一一、实验目的与要求熟悉C/C++语言的集成开发环境;通过本实验加深对分治法、贪心算法的理解。

二、实验内容:掌握分治法、贪心算法的概念和基本思想,并结合具体的问题学习如何用相应策略进行求解的方法。

三、实验题1. 【伪造硬币问题】给你一个装有n个硬币的袋子。

n个硬币中有一个是伪造的。

你的任务是找出这个伪造的硬币。

为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。

试用分治法的思想写出解决问题的算法,并计算其时间复杂度。

2.【找零钱问题】一个小孩买了价值为33美分的糖,并将1美元的钱交给售货员。

售货员希望用数目最少的硬币找给小孩。

假设提供了数目有限的面值为25美分、10美分、5美分、及1美分的硬币。

算法设计与分析实验指导书

算法设计与分析实验指导书

算法设计与分析实验指导书. . .. . .算法设计与分析实验指导书东北大学软件学院2012年.. .专业. .目录算法设计与分析 (1)实验指导书 (1)前言 (3)实验要求 (4)实验1 分治法的应用(2学时) (5)1.实验目的 (5)2.实验类型 (5)3.预习要求 (5)4.实验基本要求 (5)5.实验基本步骤 (7)实验2动态规划(2学时) (9)1.实验目的 (9)2.实验类型 (9)3.预习要求 (9)4.实验基本要求 (9)5.实验基本步骤 (10)实验3 回溯法(4学时) (12)1.实验目的 (12)2.实验类型 (12)3.预习要求 (12)4.实验基本要求 (12)5.实验基本步骤 (13)前言《算法设计与分析》是一门面向设计,处于计算机科学与技术学科核心地位的教育课程。

通过对计算机算法系统的学习,使学生理解和掌握计算机算法的通用设计方法,培养对算法的计算复杂性正确分析的能力,为独立设计算法和对算法进行复杂性分析奠定基础。

要求掌握算法复杂度分析、分治法、动态规划法、贪心法、回溯法、分支限界法等算法的设计方法及其分析方法。

能将这些方法灵活的应用到相应的问题中,并且能够用C++实现所涉及的算法,并尽量做到低复杂度,高效率。

通过本课程的实验,使学生加深对课程容的理解,培养学生严密的思维能力,运用所学知识结合具体问题设计适用的算法的能力;培养学生良好的设计风格,激励学生创造新算法和改进旧算法的愿望和热情。

希望同学们能够充分利用实验条件,认真完成实验,从实验中得到应有的锻炼和培养。

希望同学们在使用本实验指导书及进行实验的过程中,能够帮助我们不断地发现问题,并提出建议,使《算法设计与分析》课程成为对大家有益的课程。

实验要求《算法设计与分析》课程实验的目的是为了使学生在课堂学习的同时,通过一系列的实验,使学生加深理解和更好地掌握《算法设计与分析》课程教学大纲要求的容。

在《算法设计与分析》的课程实验过程中,要求学生做到:(1)仔细观察调试程序过程中出现的各种问题,记录主要问题,做出必要说明和分析。

《算法分析与设计》实验指导书(8学时)

《算法分析与设计》实验指导书(8学时)

计算机科学与技术学院算法分析与设计实验指导书2011年8月于洪编写2015年9月周应华修订目录实验一分治策略排序 (3)实验二减治策略查找顺序表 (5)实验三动态规划求解0/1背包问题 (8)实验四贪心算法求解最短路径问题 (10)附录1 关于文件的操作 (12)附录2 关于如何统计运算时间 (13)实验一分治策略排序实验目的1)以排序问题为例,掌握分治法的基本设计策略;2)熟练掌握合并排序算法的实现;3)熟练掌握快速排序算法的实现;4) 理解常见的算法经验分析方法。

实验环境计算机、C语言程序设计环境实验学时2学时实验内容与步骤1.准备实验数据要求:编写一个函数data-generate,生成2000个在区间[1,10000]上的随机整数,并将这些数输出到外部文件data.txt中。

这些数作为本算法实验的输入数据。

2.实现合并排序算法要求:实现mergesort算法。

输入:待排数据文件data.txt;输出:有序数据文件resultsMS.txt(注:建议将此排好序的数据作为实验二的算法输入);程序运行时间TimeMS。

合并排序算法(类C语言):/* 数组A[] 中包含待排元素;array B[] is a work array */TopDownMergeSort(A[], B[], n){TopDownSplitMerge(A, 0, n, B);}// iBegin is inclusive; iEnd is exclusive (即:A[iEnd]不是待排元素)TopDownSplitMerge(A[], iBegin, iEnd, B[]){if(iEnd - iBegin < 2) // 如果只有1个待排元素,返回。

return;// recursively split runs into two halves until run size == 1,// then merge themiMiddle = (iEnd + iBegin) / 2; // 划分TopDownSplitMerge(A, iBegin, iMiddle, B);TopDownSplitMerge(A, iMiddle, iEnd, B);TopDownMerge(A, iBegin, iMiddle, iEnd, B); // 合并;元素放到数组B中。

2021年《算法设计与分析》实验指导

2021年《算法设计与分析》实验指导

《算法设计与分析》实验指导《算法分析与设计》实验指导 .1 实验一锦标赛问题 [实验目的] 1. 基本掌握分治算法的原理. 2. 能用程序设计语言求解锦标赛等问题的算法; [预习要求] 1. 认真阅读数据结构教材和算法设计教材,了解分治算法原理; 2. 设计用分治算法求解背包问题的数据结构与程序代码. [实验题] 【问题描述】设有 n=2 k 个运动员要进行网球循环赛。

现要设计一个满足以下要求的比赛日程表:(1)每个选手必须与其他 n-1 个选手各赛一次;(2)每个选手一天只能参赛一次;(3)循环赛在 n-1 天内结束。

请按此要求将比赛日程表设计成有 n 行和 n-1 列的一个表。

在表中的第 i 行,第 j 列处填入第 i 个选手在第 j 天所遇到的选手。

其中 1≤i≤n,1≤j≤n-1。

[实验提示] 我们可以按分治策略将所有的选手分为两半,则 n 个选手的比赛日程表可以通过 n/2个选手的比赛日程表来决定。

递归地用这种一分为二的策略对选手进行划分,直到只剩下两个选手时,比赛日程表的制定就变得很简单。

这时只要让这两个选手进行比赛就可以了。

1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 2 1 4 3 6 7 8 5 3 4 1 2 7 8 5 6 1 2 3 4 3 2 1 8 5 6 7 1 2 3 4 5 6 7 8 1 4 3 2 1 2 1 4 3 6 5 8 7 2 1 4 3 1 2 3 4 1 2 7 8 5 6 3 2 1 4 2 1 4 3 2 1 8 7 6 5 4 3 2 1 (1)(2)(3)图 1 2 个、4 个和 8 个选手的比赛日程表图 1 所列出的正方形表(3)是 8 个选手的比赛日程表。

其中左上角与左下角的两小块分别为选手 1 至选手 4 和选手 5 至选手 8 前 3 天的比赛日程。

据此,将左上角小块中的所有数字按其相对位置抄到右下角,又将左下角小块中的所有数字按其相对位置抄到右上角,这2 样我们就分别安排好了选手 1 至选手 4 和选手 5 至选手 8 在后 4 天的比赛日程。

算法设计与分析实验指导书

算法设计与分析实验指导书

实验一串匹配程序设计(2学时)一、实验目的(1). 熟练掌握串匹配的含义(2). 掌握BF算法匹配的过程并编程实现(3). 熟悉C++编译环境的基本操作二、实验内容给定两个字符串S和T,用BF算法,在主串S中查找字串T,输出结果,输出时要求有文字说明。

请编写程序。

三、实验要求(1)、熟悉C++编译环境的基本操作(2)、考虑各种可能的情况(匹配成功或不成功)(3)、写出完整的程序四、实验结果实验二排序问题程序设计(2学时)一、实验目的(1). 掌握选择排序和起泡排序的基本思想(2). 掌握两种排序方法的具体实现过程(3). 在掌握的基础上编程实现两种排序方法二、实验内容输入一个待排序的序列,分别用选择排序和起泡排序两种排序方法将其变换成有序的序列,输出结果,输出时要求有文字说明。

请编写程序。

三、实验要求(1)、熟悉C++编译环境的基本操作(2)、考虑各种可能的情况(序列本身已是有序序列,序列不是有序序列)(3)、写出完整程序四、实验结果实验三数字旋转方阵程序设计(2学时)一、实验目的(1). 掌握分治法的设计思想(2). 掌握数字旋转方阵的具体实现过程(3). 熟练掌握二维数组的使用方法(4). 在掌握的基础上编程实现数字旋转方阵的实现过程二、实验内容给出一个初始数据,在此数据的基础上由外层向里层填写数据,完成一个数字旋转方阵,输出结果,输出时要求有文字说明。

请编写程序。

三、实验要求(1)、熟悉C++编译环境的基本操作(2)、考虑各种可能的情况(方阵有一层,两层或更多层)(3)、写出完整程序四、实验结果实验四排序中分治法的程序设计(2学时)一、实验目的(1). 掌握归并排序和快速排序的划分方法(2). 掌握归并排序和快速排序的具体分治策略(3). 在掌握的基础上编程两种排序方法的实现过程二、实验内容给出一个初始序列,分别用归并排序和快速排序两种分治法将所给序列变换为有序序列,输出结果,输出时要求有文字说明。

算法设计与分析课程实验指南

算法设计与分析课程实验指南

《算法设计与分析》课程实验指南(适合于非计算机科学与技术专业)实验项目1 串匹配问题1.实验题目给定一个文本,在该文本中查找并定位任意给定字符串。

2.学时安排2个学时。

3.实验目的(1)深刻理解并掌握蛮力法的设计思想;(2)提高应用蛮力法设计的技能;(3)理解这样一个观点:用蛮力法设计的算法,一般来说,经过适度的努力后,都可以对算法的第一个版本进行一定程度的改良,改进其时间性能。

4.实验要求(1)实现BF算法;(2)实现BF算法的改进算法:KMP算法;(3)对上述2个算法进行时间复杂性分析,并设计实验程序验证分析结果。

实验项目2 最近对问题1.实验题目设p1=(x1,y1),p2=(x2,y2),…,pn=(xn,yn)是平面上n个点构成的集合S,设计算法找出集合S中距离最近点对。

2.学时安排2个学时。

3.实验目的(1)进一步掌握递归算法的设计思想以及递归程序的调试技术;(2)理解这样一个观点:分治与递归经常同时应用在算法设计之中。

4.实验要求(1)分别用蛮力法和分治法求解最近对问题;(2)分析算法的时间性能,设计实验程序验证分析结论。

实验项目3 八枚硬币问题1.实验题目在8枚外观相同的硬币中,有一枚是人民币假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。

可以通过一架天平来任意比较两组硬币,设计一个高效的算法来测出这枚假币。

2.学时安排2个学时。

3.实验目的(1)深刻理解并掌握减治法的设计思想;(2)提高应用减治设计算法的技能;(3)理解这样一个观点:建立正确的模型对于问题的求解是非常重要的。

4.实验要求(1)设计减治算法实现8枚硬币问题;(2)设计测试数据,写出程序文档。

实验项目4 0/1背包问题1.实验题目给定n种物品和一个容量为C的背包,物品i的重量是wi,其价值为vi,0/1背包问题是如何选择装入背包的物品(物品不可分割),使得装入背包中物品总价值最大。

2.学时安排2个学时。

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

编著说明本书是为配合《算法分析与设计实验教学大纲》而编写的上机指导,其目的是使学生消化理论知识,加深对讲授内容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的分析与设计有更深刻的认识。

上机实验一般应包括以下几个步骤:(1)、准备好上机所需的程序。

手编程序应书写整齐,并经人工检查无误后才能上机。

(2)、上机输入和调试自己所编的程序。

一人一组,独立上机调试,上机时出现的问题,最好独立解决。

(3)、上机结束后,整理出实验报告。

实验报告应包括:题目、程序清单、运行结果、对运行情况所作的分析。

本书共分8~10个实验,其具体要求和步骤如下:目录实验一、C/C++环境及递归算法...................................... 错误!未定义书签。

实验二、递归与分治策略.. (5)实验三、动态规划算法(一) (9)实验四、动态规划算法(二) (12)实验五、贪心算法(一) (15)实验六、贪心算法(二) (17)实验七、回溯法(一) (20)实验八、回溯算法(二) (22)实验九、分支限界法 (24)实验十:随机化算法(选学) (29)实验二、递归与分治策略一、实验目的与要求1、进一步熟悉C/C++语言的集成开发环境;2、通过本实验加深对递归与分治策略的理解和运用;二、实验内容:1、分析并掌握“棋盘覆盖问题”的递归与分治算法示例;2、分析并掌握“二分搜索问题”的递归与分治算法示例;3、练习使用递归与分治策略求解众数问题或集合划分问题;三、实验题众数问题:给定含有N个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数,多重集合S中重数最大的元素称为多重集合S的众数,众数的重数称为多重集合S的重数,试求一个给定多重结合的重数和众数;例如:S={a,b,b,b,f,f,4,5}的重数是3,众数是b集合划分问题:N个元素的集合{1,2,…,N}可以划分为若干个非空集合的子集,例如,当N=4时,集合{1,2,3,4}可划分为15个不同的非空子集如下:{{1},{2},{3},{4}};{{1,2},{3},{4}};{{1,3},{2},{4}};{{1,4},{2},{3}};{{2,3 },{1},{4}};{{2,4},{1},{3 }};{{3,4 },{1},{2}};{{1,2 },{3,4}};{{1,3 },{2,4}};{{1,4 },{3,2 }};{{2,3,4},{1}};{{1,3,4},{2}};{{1,2,4},{3}};{{1,2,3},{4}};{{1,2,3,4}};给定正整数N,计算出N个元素的集合{1,2,…,N}可以划分多少个非空集合的子集;四、实验步骤1.理解递归和分治策略的基本思想和算法示例;2.上机输入和调试算法示例程序;3.理解实验题的问题要求;4.上机输入和调试自己所编的实验题程序;5.验证并分析实验题的实验结果;6.整理出实验报告;五、递归与分治算法示例程序1、棋盘覆盖问题:在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。

在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖;void chessBoard(int tr, int tc, int dr, int dc, int size){if (size == 1) return;int t = tile++, // L型骨牌号s = size/2; // 分割棋盘// 覆盖左上角子棋盘if (dr < tr + s && dc < tc + s) // 特殊方格在此棋盘中chessBoard(tr, tc, dr, dc, s);else {// 此棋盘中无特殊方格board[tr + s - 1][tc + s - 1] = t; // 用t 号L型骨牌覆盖右下角chessBoard(tr, tc, tr+s-1, tc+s-1, s); // 覆盖其余方格}// 覆盖右上角子棋盘if (dr < tr + s && dc >= tc + s) // 特殊方格在此棋盘中chessBoard(tr, tc+s, dr, dc, s);else {// 此棋盘中无特殊方格board[tr + s - 1][tc + s] = t; // 用t 号L型骨牌覆盖左下角// 覆盖其余方格chessBoard(tr, tc+s, tr+s-1, tc+s, s);}// 覆盖左下角子棋盘if (dr >= tr + s && dc < tc + s) // 特殊方格在此棋盘中chessBoard(tr+s, tc, dr, dc, s);else {board[tr + s][tc + s - 1] = t; // 用t 号L型骨牌覆盖右上角// 覆盖其余方格chessBoard(tr+s, tc, tr+s, tc+s-1, s)}// 覆盖右下角子棋盘if (dr >= tr + s && dc >= tc + s) // 特殊方格在此棋盘中chessBoard(tr+s, tc+s, dr, dc, s);else {board[tr + s][tc + s] = t; // 用t 号L型骨牌覆盖左上角chessBoard(tr+s, tc+s, tr+s, tc+s, s); // 覆盖其余方格}}2、二分搜索问题:⑴、设:a[0:n-1]是一个已排好序的数组。

请改写二分搜索算法,使得当搜索元素x 不在数组中时,返回小于x的最大元素的位置I和大于x的最大元素位置j。

当搜索元素在数组中时,I和j相同,均为x在数组中的位置。

⑵、设:有n个不同的整数排好序后存放于t[0:n-1]中,若存在一个下标I,0≤i<n,使得t[i]=i,设计一个有效的算法找到这个下标。

要求算法在最坏的情况下的计算时间为O(logn)。

⑶、用I,j做参数,且采用传递引用或指针的形式带回值。

bool BinarySearch(int a[],int n,int x,int& i,int& j){int left=0;int right=n-1;while(left<right){int mid=(left+right)/2;if(x==a[mid]){i=j=mid;return true;}if(x>a[mid])left=mid+1;elseright=mid-1;}i=right;j=left;return false;}int SearchTag(int a[],int n,int x) {int left=0;int right=n-1;while(left<right){int mid=(left+right)/2;if(x==a[mid])return mid;if(x>a[mid])right=mid-1;elseleft=mid+1;}return -1;}实验三、动态规划算法(一)一、实验目的与要求1.通过动态规划算法的示例程序理解动态规划算法的基本思想;2.运用动态规划算法解决实际问题加深对动态规划算法的理解和运用;二、实验内容:1.分析并掌握“最长公共子序列”问题的动态规划算法求解方法;2.练习使用动态规划算法求解“游艇租用”问题;三、实验题游艇租用问题:长江旅游俱乐部在长江上设置了N个游艇出租站1,2,3,…,N,游客在这些站中租用游艇,并在下游的任何一个游艇出租站归还,游艇出租站i到游艇出租站j之间的租金为r(i,j),1≤i<j≤N;试求出从游艇出租站1到游艇出租站N所需的最少租金及其游艇租用和归还方案;四、实验步骤1.理解动态规划算法思想和算法示例;2.上机输入和调试算法示例程序;3.理解实验题的问题要求;4.上机输入和调试自己所编的实验题程序;5.验证并分析实验题的实验结果;6.整理出实验报告;五、动态规划算法示例程序最长公共子序列问题:若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。

例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。

给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。

给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。

include "stdlib.h"#include "string.h"void LCSLength(char *x ,char *y,int m,int n, int **c, int **b){int i ,j;for (i = 1; i <= m; i++) c[i][0] = 0;for (i = 1; i <= n; i++) c[0][i] = 0;for (i = 1; i <= m; i++)for (j = 1; j <= n; j++){if (x[i]==y[j]){c[i][j]=c[i-1][j-1]+1;b[i][j]=1;}else if (c[i-1][j]>=c[i][j-1]){c[i][j]=c[i-1][j];b[i][j]=2;}else{ c[i][j]=c[i][j-1];b[i][j]=3;}}}void LCS(int i ,int j, char *x ,int **b) {if (i ==0 || j==0) return;if (b[i][j]== 1){LCS(i-1,j-1,x,b);printf("%c",x[i]);}else if (b[i][j]== 2)LCS(i-1,j,x,b);else LCS(i,j-1,x,b);}实验四、动态规划算法(二)一、实验目的与要求1、通过动态规划算法的示例程序进一步理解动态规划算法的基本思想;2、运用动态规划算法解决实际问题进一步加深对动态规划算法的理解和运用;二、实验内容:1、分析并掌握“最大字段和” 问题的动态规划算法求解方法;2、练习使用动态规划算法求解“石子合并”问题;三、实验题石子合并问题:在一个圆形操场的四周摆放着数量相同或不同的N 堆石子,现将N 堆石子有序地合并一堆,规定每次只能将相邻的2堆石子合并成新的一堆石子,并将新的一堆石子数记为该次合并的得分,试设计一个算法,计算出将N 堆石子合并成一堆的最小和最大得分;四、实验步骤1.理解动态规划算法思想和算法示例; 2.上机输入和调试算法示例程序; 3.理解实验题的问题要求;4.上机输入和调试自己所编的实验题程序; 5.验证并分析实验题的实验结果; 6.整理出实验报告;五、动态规划算法示例程序最大字段和问题:若给定n 个整数(可能有负整数)组成的序列n a a a ,,,21 ,求该序列中形如形如∑=jik k a ,( n j i ≤≤≤1)的字段和的最大值。

相关文档
最新文档