浙江工业大学算法实验2 动态规划算法实现_第1页
浙江工业大学算法实验2 动态规划算法实现_第2页
浙江工业大学算法实验2 动态规划算法实现_第3页
浙江工业大学算法实验2 动态规划算法实现_第4页
浙江工业大学算法实验2 动态规划算法实现_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验2动态规划算法实现一、实验目标:熟悉动态规划算法实现的基本方法和步骤;学会动态规划算法的实现方法和分析方法:二、实验内容:问题1:最长公共子序列的问题,测试数据X=ABCBDAB Y=BDCABAX=zhejiang university of technology Y= (zhejiang university city college1-1实验代码及截图#include#include using namespace std;/求得两个字符串的最大公共子序列长度int LCSLength(int m, int n,char* x, char* y,int *c, int *b)int

2、i, j, len;/i=0 | j=0for (i = 0; i m + 1; i+) ci0 = 0;for (j = 0; j 0for (i = 1; i = m; i+)for (j = 1; j = cij- 1)cij = ci- 1j;bij = 2;elsecij = cij- 1;bij = 3;len = cmn;return len;/构造最长公共子序列void LCS(int i, int j, char *x, int *b)if (i = 0 | j = 0) return;if (bij = 1)LCS(i - 1, j- 1, x, b);cout xi -

3、1;/ci对应 str1 的第 i-1 个元素 else if (bij = 2)LCS(i - 1, j, x, b);elseLCS(i, j- 1, x, b);int main()char str11000, str21000;int i, m, n, len;cout 请输入第一个字符串:;gets_s(str1);cout 请输入第二个字符串:; gets_s(str2);m = strlen(strl);n = strlen(str2);int *c = new int*m + 1; /彳亍for (i = 0; i m + 1; i+)ci = new intn + 1;/列i

4、nt *b = new int*m + 1;for (i = 0; i m + 1; i+)bi = new intn + 1;len = LCSLength(m, n, str1, str2, c, b);cout 最长公共子序列的长度为: len endl;cout (最长公共子序列为:);LCS(m, n, str1, b);cout endl;system(pause);return 0;实验截图: Fc-PrActicecxieCakulateMethDd&De-bugCAkuhtcMethDdLexeEhejiog university of tocluioloffy ij输人J(

5、5 二个子符暗:zhejiiijig university city college 归女会共子洋列曲以为* a& 最氏公共子序列为e zhejiang iin s vers i tyfi-jiaay 讷按任意世姓姓. .1-2实验总结:实验最开始考虑到穷举,但很明显时间复杂度过于庞大,利用最长公共子序列的最优子结构 性质,结合书上代码进行实验,但实验中很明显没有考虑多种最长公共子序列的情况,这个 可能要留待后续继续学习改进。1-3参考书籍:本书部分代码。2.最大子段和问题,比较三重循环,分治法和动态规划算法的效果,测试数据:(-2,11,-4,13,-5,-2)过去大约三百年间,太阳黑子数的

6、时间数据如该链接所示,请问,历史上何时太阳黑子迎来了最大爆发?2.1-1 .实验代码及截图#includeusing namespace std;int MaxSum1(int n, int *a, int& besti, int& bestj)int sum = 0;for (int i = 1; i = n; i+)for (int j = i; j = n; j+)int thissum = 0;for (int k = i; k sum)sum = thissum;besti = i;bestj = j;return sum;int MaxSum2(int* a, int left,

7、int right)int sum = 0;if (left = right)sum = aleft 0 ? aleft : 0;elseint center = (left + right) / 2;int leftsum = MaxSum2(a, left, center);int rightsum = MaxSum2(a, center + 1, right);int s1 = 0;int lefts = 0;for (int i = center; i = left; i-)lefts += ai;if (lefts s1)s1 = lefts;int s2 = 0;int right

8、s = 0;for (int i = center + 1; i s2)s2 = rights;sum = s1 + s2;if (sum leftsum)sum = leftsum;if (sum rightsum)sum = rightsum;return sum;int MaxSum3(int n, int *a)int sum = 0, b = 0;for (int i = 1; i 0) b += ai;else b = ai;if (b sum)sum = b;return sum;int main()int n,besti, bestj;int a = -2, 11,-4, 13

9、,-5,-2 ;cout 三重循环:MaxSum1(6, a, besti, bestj) endl;cout 分治法: MaxSum2(a, 1, 6) endl;cout 动态规划: MaxSum3(6, a) endl;system(pause);实验截图:2实验总结:三重循环时间复杂度为n*n*n,分治法时间复杂度为nlogn,动态规划时间复杂度为n 简单穷举是最容易想到的,但是论间接性或时间空间复杂度都是动态规划更加优越,通过实 验感受动态规划的魅力3参考书籍:本书部分代码。1实验代码及截图#include#include#include#include #include using

10、 namespace std;double MaxSum1(int n, double *a, int& besti, int& bestj) double sum = 0;for (int i = 1; i = n; i+)for (int j = i; j = n; j+)double thissum = 0;for (int k = i; k sum)sum = thissum;besti = i;bestj = j;return sum;double MaxSum2(double* a, int left, int right)double sum = 0;if (left = rig

11、ht)sum = aleft 0 ? aleft : 0;elseint center = (left + right) / 2;double leftsum = MaxSum2(a, left, center);double rightsum = MaxSum2(a, center + 1, right);double si = 0;double lefts = 0;for (int i = center; i = left; i-)lefts += ai;if (lefts si)si = lefts;double s2 = 0;double rights = 0;for (int i =

12、 center + 1; i s2)s2 = rights;sum = si + s2;if (sum leftsum)sum = leftsum;if (sum rightsum)sum = rightsum;return sum;double MaxSum3(int n, double *a)double sum = 0, b = 0;for (int i = 1; i 0) b += ai;else b = ai;if (b sum)sum = b;return sum;int main() ifstream myfile(f:太 阳黑子.txt);if (!myfile.is_open

13、() cerr 文件打不开 endl;return 0;vector vec;string temp;while (getline(myfile, temp)vec.push_back(temp);double a500;int i = 0;for (auto j = vec.begin(); j != vec.end(); j+)istringstream is(*j);string s;int tmp = 0;while (is s)if (tmp = 2) double r = atof(s.c_str();ai+ = r;tmp+;i-;/int sum;int besti, best

14、j;clock_t cstart, cends;cstart = clock();double sum1 = MaxSum1(i, a, besti, bestj);cends = clock();int t1 = cends - cstart;cstart = clock();double sum2 = MaxSum2(a, 1, i);cends = clock();int t2 = cends - cstart;cstart = clock();double sum3 = MaxSum3(i,a);cends = clock();int t3 = cends - cstart;cout 太阳黑子最大爆发年份:;cout vec.at(bestj) endl;/cout vec.at(sum) endl;cout 三重循环用时: t1 毫秒 endl;cout 分治法用时: t2 毫秒 endl;cout 动态规划用时:t3 毫秒 endl; system(pause);实验截图2.2-2实验总结:实验中最大字段和算法

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论