最长公共子序列 变形
重点是最后不是求长度 而是最长序列的列举其中一种情况
所以注意标记 刚开始用dp[i][j] = 1,2,3,4…… 就以为是解 其实不然
很难具体说 看代码吧


#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using std::string; const int maxn = 105; char a[maxn][35], b[maxn][35]; int dp[maxn][maxn]; char ans[maxn][maxn][3500]; int main() { while(scanf("%s", a[1])!=EOF) { int i = 1, j, round=0; memset(dp, 0, sizeof(dp)); memset(ans, 0, sizeof(ans)); if(strcmp(a[1], "#")!=0) while(scanf("%s", a[++i]), strcmp(a[i], "#")!=0); int lenA = i-1; i = 0; while(scanf("%s", b[++i]), strcmp(b[i], "#")!=0); int lenB = i-1; for(i=1; i<=lenA; i++) for(j=1; j<=lenB; j++) { if(dp[i][j-1] <= dp[i-1][j]) { dp[i][j] = dp[i-1][j]; strcpy(ans[i][j], ans[i-1][j]); } else { dp[i][j] = dp[i][j-1]; strcpy(ans[i][j], ans[i][j-1]); } if(!strcmp(a[i], b[j])) { if(dp[i][j] < dp[i-1][j-1]+1) { dp[i][j] = dp[i-1][j-1]+1; strcpy(ans[i][j], ans[i-1][j-1]); strcat(ans[i][j], a[i]); strcat(ans[i][j], " "); } } } int size = strlen(ans[lenA][lenB]); for(i=0; i<size-1; i++) printf("%c", ans[lenA][lenB][i]); printf("\n"); } return 0; }