首页 > 其他 > 详细

HDU 5791 Two

时间:2016-08-07 12:10:17      阅读:238      评论:0      收藏:0      [点我收藏+]

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

 

分析:很自然想到最长公共子序列的转移的转移形式,用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;

}

 

HDU 5791 Two

原文:http://www.cnblogs.com/137033036-wjl/p/5745867.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!