给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Input示例
abcicba abdkscab
Output示例
abca
dp基础题…打算慢慢写51nod,所以还是蛮发吧
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1005;
char s1[maxn] = {0};
char s2[maxn] = {0};
char s3[maxn] = {0};
int dp[maxn][maxn] = {0};
int main(void ) {
int i, j;
scanf("%s %s", s1 + 1, s2 + 1);
for(i = 1; s1[i]; i++)
for(j = 1; s2[j]; j++) {
dp[i][j] = max(max(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1] + (s1[i]==s2[j] ? 1 : 0));
}
i--; j--;
int k = 0;
while(i > 0 && j > 0) {
if(s1[i] == s2[j]) {
s3[k++] = s1[i];
i--; j--;
}
else {
dp[i-1][j] > dp[i][j-1] ? i-- : j--;
}
}
s3[k] = 0;
reverse(s3, s3 + k);
printf("%s\n", s3);
return 0;
}