题目链接:这里
题意:给你两个数组,问你公共子序列的数量是多少
解法:dp[i][j]表示第一个串考虑到i位,第二个串考虑到j位的答案是多少
那么dp[i][j] = dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]
如果a[i]=b[j],dp[i][j]+=dp[i-1][j-1]+1
//HDU 5791
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
int dp[1010][1010];//代表第一个串在i位置,第二个串在j位置的方案数
int n, m, a[1010], b[1010];
int main(){
while(scanf("%d%d", &n, &m) != EOF)
{
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 1; i <= m; i++) scanf("%d", &b[i]);
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1];
if(a[i] == b[j]) dp[i][j] += dp[i-1][j-1] + 1;
if(dp[i][j] < 0) dp[i][j] += mod;
if(dp[i][j] >= mod) dp[i][j] %= mod;
}
}
printf("%d\n", dp[n][m]);
}
return 0;
}