LCS - 最长公共子序列

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
char a[100];
char b[100];
int dp[10][10];
int max(int a,int b)
{
    if(a>b) return a;
    else return b;
}
int lcs(char a[],char b[],int m,int n) //备忘录法
{
    if(dp[m][n]!=-1) return dp[m][n];
    if(a[m]==b[n]) dp[m][n]=lcs(a,b,m-1,n-1)+1;
    else dp[m][n]= max(lcs(a,b,m-1,n),lcs(a,b,m,n-1));
    if(m==0||n==0) return dp[m][n]=0;
    return dp[m][n];
}
int lcs1(char a[],char b[],int dp[10][10])   //动态规划法
{
    int ma= strlen(a+1);
    int mb= strlen(b+1);
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=ma;i++){
        for(int j=1;j<=mb;j++){
            if(a[i]==b[j]){
                dp[i][j]=dp[i-1][j-1]+1;
            }
            else{
                if(dp[i-1][j]>=dp[i][j-1]) dp[i][j]=dp[i-1][j];
                else dp[i][j]=dp[i][j-1];
            }
        }
    }
    return dp[ma][mb];
}
int main()
{
    cin>>a+1>>b+1;
    cout<<a+1<<" "<<b+1<<endl;
    int s=lcs1(a,b,dp);
    printf("这个矩阵是%d*%d \n",strlen(a+1),strlen(b+1));
    for(int i=1;i<=strlen(a+1);i++) dp[i][0]=a[i];
    for(int i=1;i<=strlen(b+1);i++) dp[0][i]=b[i];
    for(int i=0;i<=strlen(a+1);i++){
        for(int j=0;j<=strlen(b+1);j++) {
            if(i==0||j==0) printf("%c ",dp[i][j]);
            else printf("%d ",dp[i][j]);
        }
        printf("\n");
    }
    printf("max=%d\n",s);

    return 0;
}


猜你喜欢

转载自blog.csdn.net/hujinhong145/article/details/80034494