资源描述:
《算法分析实验四报告》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、《算法设计与分析》实验报告目录一、实验内容描述和功能分析.二、算法过程设计.三、程序调试及结果(附截图).四、源代码(附源代码).一、实验内容描述和功能分析.1.最长公共子序列内容描述:一个给定序列的子序列是在该序列中删去若干元素后得到的序列。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。例如,若X={A,B,C,B,D,B,A},Y={B,D,C,A,B,A},则序列{B,C,A}是X和Y的一个公共子序列,但它不是X和Y的一个最长公共子序列。序列{B,C,B,A}
2、也是X和Y的一个公共子序列,它的长度为4,而且它是X和Y的一个最长公共子序列,因为X和Y没有长度大于4的公共子序列。最长公共子序列问题就是给定两个序列X={x1,x2,...xm}和Y={y1,y2,...yn},找出X和Y的一个最长公共子序列。功能分析:输入包含多组测试数据。第一行为一个整数C,表示有C组测试数据,接下来有C行数据,每组测试数据占1行,它由2个给定序列的字符串组成,两个字符串之间用空格隔开.输出应该有C行,即每组测试数据的输出占一行,它是计算出的最长公共子序列长度。例如:输入:1输出:4ABCB
3、DBABDCABA2.MinimalmSums内容描述:给定n个整数组成的序列,现在要求将序列分割为m段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小?编程任务:给定n个整数组成的序列,编程计算该序列的最优m段分割,使m段子序列的和的最大值达到最小。功能分析:输入由多组测试数据组成。每组测试数据输入的第1行中有2个正整数n和m。正整数n是序列的长度;正整数m是分割的段数。接下来的一行中有n个整数。对应每组输入,输出的每行是计算出的m段子序列的和的最大值的最小值。例如:输入:1
4、1输出:1010二、算法过程设计.1.最长公共子序列最长公共子序列问题是通过定义数组和指针来寻找两者的公共子序列,实现对问题的解决。2.MinimalmSums这个问题是通过定以一个一维数组和一个二维数组来实现问题的解决。三、程序调试及结果(附截图).1.最长公共子序列2.MinimalmSums四、源代码(附源代码).1.最长公共子序列#include#include#defineN100chara[N],b[N],str[N];intlcs_len(char*a,char
5、*b,intc[][N]){intm=strlen(a),n=strlen(b),i,j;for(i=0;i<=m;i++)c[i][0]=0;for(j=1;j<=n;j++)c[0][j]=0;for(i=1;i<=m;i++)for(j=1;j<=n;j++)if(a[i-1]==b[j-1])c[i][j]=c[i-1][j-1]+1;elseif(c[i-1][j]>=c[i][j-1])c[i][j]=c[i-1][j];elsec[i][j]=c[i][j-1];returnc[m][n];}cha
6、r*build_lcs(chars[],char*a,char*b){intk,i=strlen(a),j=strlen(b),c[N][N];k=lcs_len(a,b,c);/*将c[][]传给lcs_len()计算并求出长度,将中间结果放在c[][]中*/s[k]=' ';/*s串的结束标记*/while(k>0)/*开始倒推*/if(c[i][j]==c[i-1][j])i--;elseif(c[i][j]==c[i][j-1])j--;else{s[--k]=a[i-1];/*将一个公共字符存入s中*
7、/i--;j--;}returns;}intmain(){intn,m;scanf("%d",&m);getchar();while(m--){scanf("%s%s",a,b);n=strlen(build_lcs(str,a,b));printf("%d",n);}return0;}2.MinimalmSums#includeusingnamespacestd;intt[100];intf[100][100];voids(intn,intm){inti,j,k,temp,maxt;fo
8、r(i=1;i<=n;i++)f[i][1]=f[i-1][1]+t[i];for(j=2;j<=m;j++)for(i=j;i<=n;i++){for(k=1,temp=99999999;kf[k][j-1]?(f[i][1]-f[k][1]):f[k][j-1];if(temp>maxt)temp=maxt