题意:给两个序列,求公共序列的个数
分析:很自然想到最长公共子序列的转移的转移形式,用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;
}