题意:
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5791
求两个序列有多少对公共子序列。
思路:
dp[I][j]表示序列a第I个之前以及序列b第j个之前的有多少对公共子序列。状态转移的时候要减去重复的。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 1005;
const LL MOD = 1e9 + 7;
int a[MAXN], b[MAXN];
LL dp[MAXN][MAXN];
int main() {
int n, m;
while (scanf("%d%d", &n, &m) == 2) {
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
for (int i = 1; i <= m; i++) {
scanf("%d", &b[i]);
}
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
dp[i][j] = (dp[i][j] + dp[i][j - 1]) % MOD;
dp[i][j] = (dp[i][j] + dp[i - 1][j]) % MOD;
dp[i][j] = ((dp[i][j] - dp[i - 1][j - 1]) % MOD + MOD) % MOD;
if (a[i] == b[j]) {
dp[i][j] = (dp[i][j] + dp[i - 1][j - 1] + 1) % MOD;
}
}
}
printf("%I64d\n", dp[n][m]);
}
return 0;
}