#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn = 1E3 + 10;char a[maxn],b[maxn],ans[maxn];int dp[maxn][maxn];int main(){scanf("%s%s",a + 1,b + 1);int n = strlen(a+1),m = strlen(b+1);memset(dp,0,sizeof(dp));for(int i = 1 ; i <= n ; ++i){for(int j = 1 ; j <= m ; ++j){if(a[i] == b[j]){dp[i][j] = dp[i-1][j-1] + 1;}else dp[i][j] = max(dp[i][j-1],dp[i-1][j]);}}int cur = 0;for(int i = n,j = m;dp[i][j];--i,--j){//返回到第一次更新值的地方while(dp[i][j] == dp[i - 1][j]) --i;while(dp[i][j] == dp[i][j - 1]) --j;ans[cur++] = a[i];}reverse(ans,ans+cur);ans[cur] = ‘\0‘;printf("%s\n",ans);return 0;}
[2016-05-09][51nod][1006 最长公共子序列Lcs]
原文:http://www.cnblogs.com/qhy285571052/p/c9c5016a80bf89ff2c00599af3f1c881.html