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");
}
}