hdu 5791 Two dp

来源:互联网 发布:exe软件重新编译 编辑:程序博客网 时间:2024/05/16 13:57

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