最长公共子序列的动态规划求解
来源:互联网 发布:flux软件 编辑:程序博客网 时间:2024/04/28 22:18
#include <cstdio>#include <cstring>int dp[110][110], c[110][110];char a[110], b[110], str[110];int la, lb, l;void find(int i, int j){ if(i==0 || j==0) return; if(c[i][j] == 1) { str[l] = a[i]; l--; find(i-1, j-1); } else if(c[i][j] == 2) find(i-1, j); else find(i, j-1);}int main(){int t;scanf("%d", &t);getchar();while(t--) { scanf("%s", a+1); scanf("%s", b+1); la = strlen(a+1); lb = strlen(b+1); for(int i=0; i<=la; i++) dp[i][0] = 0; for(int i=1; i<=lb; i++) dp[0][i] = 0; for(int i=1; i<=la; i++) for(int j=1; j<=lb; j++) { if(a[i] == b[j]) { dp[i][j] = dp[i-1][j-1] + 1; c[i][j] = 1; } else if(dp[i-1][j] >= dp[i][j-1]) { dp[i][j] = dp[i-1][j]; c[i][j] = 2; } else { dp[i][j] = dp[i][j-1]; c[i][j] = 3; } } printf("%d ", dp[la][lb]); l = dp[la][lb]; find(la, lb); for(int i=1; i<=dp[la][lb]; i++) printf("%c", str[i]); printf("\n"); } return 0;}