LightOJ 1157 LCS Revisited(LCS)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1157

题意:求出两个串最长公共子列的个数。

思路:看别人的,感觉还是有点朦胧。。。。

 

View Code 

 #include <iostream>

 #include <cstdio>

 #include <cstring>

 #define max(x,y) ((x)>(y)?(x):(y))

 using namespace std;

  

 const int MOD=1000007;

 const int MAX=1005;

 int f[MAX][MAX],p[MAX][MAX],q[MAX][MAX],next[MAX][26];

 int C,num=0,n,m;

 char s[MAX],t[MAX];

  

  

 int DP()

 {

     f[n][m]=0;

     p[n][m]=1;

     int i,j,k;

     for(i=n;i>=0;i--) for(j=m;j>=0;j--) if(i!=n||j!=m)

     {

         if(i<n) f[i][j]=max(f[i][j],f[i+1][j]);

         if(j<m) f[i][j]=max(f[i][j],f[i][j+1]);

         if(i<n&&j<m&&s[i]==t[j]) f[i][j]=max(f[i][j],f[i+1][j+1]+1);

  

         if(i<n&&j<m&&s[i]==t[j])

         {

             p[i][j]=p[i+1][j+1];

         }

         else if(j<m&&f[i][j+1]==f[i][j])

         {

             p[i][j]=p[i][j+1];

             if(i<n&&f[i+1][j]==f[i][j])

             {

                 p[i][j]=(p[i][j]+q[i+1][j])%MOD;

                 k=next[j+1][t[j]-'a'];

                 if(k!=-1&&f[i+1][k]==f[i+1][j])

                 {

                     p[i][j]=(p[i][j]-q[i+1][k])%MOD;

                     p[i][j]=(p[i][j]+MOD)%MOD;

                 }

             }

         }

         else if(i<n&&f[i+1][j]==f[i][j])

         {

             p[i][j]=p[i+1][j];

         }

  

         if(i<n&&j<m&&s[i]==t[j]) q[i][j]=p[i][j];

         else if(i<n&&f[i+1][j]==f[i][j]) q[i][j]=q[i+1][j];

     }

     return p[0][0];

 }

  

  

  

 int main()

 {

     for(scanf("%d",&C);C--;)

     {

         scanf("%s%s",s,t);

         n=strlen(s);

         m=strlen(t);

         memset(f,-1,sizeof(f));

         memset(next,-1,sizeof(next));

         memset(p,0,sizeof(p));

         memset(q,0,sizeof(q));

         int i,j;

         for(i=m-1;i>=0;i--) for(j=0;j<26;j++)

         {

             next[i][j]=next[i+1][j];

             if(t[i]==j+'a') next[i][j]=i;

         }

         printf("Case %d: %d\n",++num,DP());

     }

     return 0;

 }

 

  

 

你可能感兴趣的:(vi)