最长公共子序列的动态规划求解

来源:互联网 发布: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;}

原创粉丝点击