51 nod 1006 最长公共子序列Lcs

#include <iostream>
#include <cstring>
using namespace std;
int dp[1005][1005];
int vis[1005][1005];
string a,b;

void print(int len1,int len2)
{
    if(vis[len1][len2]==0){
        if(dp[len1][len2]==0) return;
        print(len1-1,len2-1);
//        cout<<len1-1<<endl;
        cout<<a[len1-1];
    }
    else if(vis[len1][len2]==1){
        print(len1-1,len2);
    }
    else if(vis[len1][len2]==-1){
        print(len1,len2-1);
    }
//    if(dp[len1][len2]==0) return;
}

int main()
{
    string s;
    cin>>a>>b;
    memset(dp,0,sizeof(dp));
    memset(vis,0,sizeof(vis));
    int length1=a.length();
    int length2=b.length();
    for(int i=1;i<=length1;i++){
        for(int j=1;j<=length2;j++){
            if(a[i-1]==b[j-1]){
                dp[i][j]=dp[i-1][j-1]+1;
                vis[i][j]=0;
            }
            else if(dp[i-1][j]>dp[i][j-1]){
                dp[i][j]=dp[i-1][j];
                vis[i][j]=1;
            }
            else{
                dp[i][j]=dp[i][j-1];
                vis[i][j]=-1;
            }
        }
    }
//    for(int i=1;i<=length1;i++){
//        for(int j=1;j<=length2;j++){
//            cout<<dp[i][j]<<" ";
//        }
//        cout<<endl;
//    }
    print(length1,length2);
    return 0;
}
View Code

用vis标记走过的路径,用递归的方式输出最优方案。

posted @ 2018-05-09 22:33  凌乱风中  阅读(90)  评论(0编辑  收藏  举报