HDU 1503 - 最长公共子序列

传送门

题目大意:

举个例子: apple 和 peach,合成一个词最短是appleach。像这样求两个单词合成后的最短长度。

题目分析:

首先肯定想到是LCS只输出一遍,难点就是怎么输出:其实只要向求LCS时的顺序再走一遍。

code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
using namespace std;

const int N = 1005;
char s[N], t[N];
int f[N][N], n, m, flag[N][N];

inline void getSame(int i, int j){
    if(!i && !j) return;
    if(!flag[i][j]){
        getSame(i - 1, j - 1);
        printf("%c", s[i]);
    }
    else if(flag[i][j] == 1)
        getSame(i - 1, j), printf("%c",s[i]);
    else getSame(i, j - 1), printf("%c", t[j]);
}

int main(){
    while(~scanf("%s%s", s + 1, t + 1)){
        // scanf("%s", s + 1);
        n = strlen(s + 1);
        m = strlen(t + 1);
        memset(f, 0, sizeof f);
        for(int i = 1; i <= n; i++) flag[i][0] = 1;
        for(int i = 1; i <= m; i++) flag[0][i] = -1;
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= m; j++){
                if(s[i] == t[j]) f[i][j] = f[i - 1][j - 1] + 1, flag[i][j] = 0;
                else if(f[i - 1][j] >= f[i][j - 1]) f[i][j] = f[i - 1][j], flag[i][j] = 1;
                else f[i][j] = f[i][j - 1], flag[i][j] = -1;
            }
        getSame(n, m);
        printf("\n");
    }
}

posted @ 2017-10-12 23:43  CzYoL  阅读(147)  评论(0编辑  收藏  举报