LCS模板

时间复杂度O(m*n)

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <math.h>
#include <stdlib.h>
#define INF 0x3f3f3f3f
#define maxn 10000+10
#define cle(a) memset(a,0,sizeof(a))
using namespace std;
char a[maxn],b[maxn];
int dp[maxn][maxn];
int main()
{
    while(cin>>a>>b){
        int la=strlen(a);
        int lb=strlen(b);
        for(int i=0;i<la;i++)dp[i][0]=0;
        for(int j=0;j<lb;j++)dp[0][j]=0;
        //cle(dp)
        for(int i=1;i<=la;i++)
            for(int j=1;j<=lb;j++){
                if(a[i-1]==b[j-1])dp[i][j]=dp[i-1][j-1]+1;
                else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
        printf("%d\n",dp[la][lb]);
    }
    return 0;
}

如果要输出最长公共子序列,可以添加flag[][]数组,进行转移方向的记录,逆推。

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <math.h>
#include <stdlib.h>
#define INF 0x3f3f3f3f
#define maxn 500+10
#define cle(a) memset(a,0,sizeof(a))
using namespace std;
char a[maxn],b[maxn];
int dp[maxn][maxn];
int flag[maxn][maxn];
char lcs[maxn];
int main()
{
    while(cin>>a>>b){
        int la=strlen(a);
        int lb=strlen(b);
        for(int i=0;i<la;i++)dp[i][0]=0;
        for(int j=0;j<lb;j++)dp[0][j]=0;
        //cle(dp)
        for(int i=1;i<=la;i++)
            for(int j=1;j<=lb;j++){
                if(a[i-1]==b[j-1]){
                    dp[i][j]=dp[i-1][j-1]+1;
                    flag[i][j]=1;//向右下转移
                }
                else{
                    if(dp[i-1][j]>dp[i][j-1]){
                        flag[i][j]=2;//向下转移
                        dp[i][j]=dp[i-1][j];
                    }
                    else{
                        flag[i][j]=3;//向右转移
                        dp[i][j]=dp[i][j-1];
                    }
                }
            }
        int i=la,j=lb;
        int k=0;
        while(i>0&&j>0){
            if(flag[i][j]==1){
                lcs[k]=a[i-1];
                k++,i--,j--;
            }
            else if(flag[i][j]==2)i--;
            else if(flag[i][j]==3)j--;
        }
        printf("%d\n",dp[la][lb]);
        for(int i=k-1;i>=0;i--)
            printf("%c",lcs[i]);
    }
    return 0;
}

 

posted on 2015-08-27 14:39  Beserious  阅读(416)  评论(0编辑  收藏  举报