贪心算法求最大公共子段和

一.实验目的:

用贪心算法编写最大子段和问题,要求输入两个字符数组,求出最长公共子序列,输出长度与公共序列。

二.实验代码:

#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;

}


猜你喜欢

转载自blog.csdn.net/yang03_26/article/details/80773533