题目链接:这里
题意:给你两个数组,问你公共子序列的数量是多少
解法: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;
}