一.实验目的:
用贪心算法编写最大子段和问题,要求输入两个字符数组,求出最长公共子序列,输出长度与公共序列。
二.实验代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int changdu(charx[],char y[],int n,int m,int a[][15],int b[][15])//x[]代表一个序列,y[]代表另一个序列 ,a[][]代表最大公共子段和大小,b[][]代表路径
{
int i,j;
for(i=0;i<=n;i++){//初始化第0行
a[0][i]=0;b[0][i]=0; }
for(j=0;j<=m;j++){//初始化第0列
a[j][0]=0;b[j][0]=0;}
for(i=1;i<=m;i++) //从第一行开始计算a数组和b数组中的每一个值
for(j=1;j<=n;j++)
{
if(x[j]==y[i]){//如果两个字符相同,a等于左上角值加1
a[i][j]=a[i-1][j-1]+1;
b[i][j]=2;//用1,2,3来表示b数组中路径的来源方向
}
//如果两个字符不同,a[i][j]等于其左面和上面的值中大的那个
else if(a[i-1][j]>=a[i][j-1]){
a[i][j]=a[i-1][j];
b[i][j]=1;
}
else{
a[i][j]=a[i][j-1];
b[i][j]=3;
}
}
return a[m][n];//返回最长公共子序列的长度
}
void xulie(charx[],int j,int i,int b[][15])//从后往前找,b[]中数值代表走向
{
if(j!=0&&i!=0)
{
if(b[i][j]==1)//找上方的值
{
i=i-1;
xulie(x,j,i,b);
}
else if(b[i][j]==2)//找到相同的字符输出,并找左上方值
{
i=i-1;
j=j-1;
xulie(x,j,i,b);
printf("%c",x[j+1]);
}
else//找左方的值
{
j=j-1;
xulie(x,j,i,b);
}
}
}
int main(){
char x[10],y[10];//定义存放2个字符串的一维数组
int a[15][15],b[15][15];//定义2个二维数组来存放路径和子序列长度
int n,m,i,j;
printf("输入第一个序列的大小:");
scanf("%d",&n);
printf("输入第二个序列的大小:");
scanf("%d",&m);
getchar();
printf("输入第一个序列:");
for(i=1;i<=n;i++)
{
scanf("%c",&x[i]);
}
getchar();
printf("输入第二个序列:");
for(j=1;j<=m;j++){
scanf("%c",&y[j]);
}
printf("显示最长公共子序列的长度:%d\n",changdu(x,y,n,m,a,b));
printf("显示所有的最长公共子序列:");
xulie(x,n,m,b);
return 0;
}