HDU 5791 Two

时间:2021-12-03 18:38:30

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

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

}