HDU 5791 Two

题意:给两个序列,求公共序列的个数

 

分析:很自然想到最长公共子序列的转移的转移形式,用dp[i][j]表示第一个串前i个

和第二个串前j个匹配的答案数量,a[i]==b[i],dp[i][j]=dp[i-1][j]+d[i][j-1]+1

a[i]!=b[i],dp[i][j]=dp[i-1][j]+dp[i][j]-1]-dp[i-1][j-1]

 

代码:

#include<bits/stdc++.h>

using namespace std;

const int maxn=1e3+5;

const int mod=1e9+7;

typedef long long ll;

int a[maxn],b[maxn];

ll dp[maxn][maxn];

 

int main(){

   int n,m;

   while(cin>>n>>m){

     for(int i=1;i<=n;i++)

       cin>>a[i];

     for(int j=1;j<=m;j++)

       cin>>b[j];

     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]+dp[i][j-1]+1)%mod;

          else

          dp[i][j]=(dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+mod)%mod;

 

     cout<<dp[n][m]<<endl;

   }

   return 0;

}

 

posted @ 2016-08-07 11:54  幻世沉溺  阅读(96)  评论(0编辑  收藏  举报