M.LCS打印

来源:互联网 发布:windows defender在哪 编辑:程序博客网 时间:2024/06/03 18:49
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <stack>

using namespace std;
char a[1000 + 5],b[1000 + 5];
int dp[1000 + 5][1000 +5];
int dis[1000 + 5][1000 + 5][2];

int main()
{
    scanf("%s%s",a+1,b+1);
    stack<char> s;
    int n = strlen(a+1);
    int m = strlen(b+1);

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            if(a[i] == b[j])
            {
                dis[i][j][0] = i-1;
                dis[i][j][1] = j-1;
                dp[i][j] = dp[i-1][j-1] + 1;
            }
            else if(dp[i-1][j] < dp[i][j-1])
            {
                dis[i][j][0] = i;
                dis[i][j][1] = j-1;
                dp[i][j] = dp[i][j-1];
            }
            else
            {
                dis[i][j][0] = i-1;
                dis[i][j][1] = j;
                dp[i][j] = dp[i-1][j];
            }


    while(dp[n][m] != 0)
    {
        int nx = dis[n][m][0];
        int my = dis[n][m][1];
        if(dp[n][m] > dp[nx][my])
            s.push(a[n]);
        n = nx;
        m = my;
    }

    while(!s.empty())
    {
        cout<<s.top();
        s.pop();
    }
    cout<<endl;

    return 0;
}
0 0