您的位置:首页 > 其它

HDU 5791 Two (dp)

2016-08-02 20:25 411 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5791

题目问a和b有多少个相同的子序列。

dp[i][j]表示A序列前i个数和B序列前j个数的相同子序列对有多少个.

cnt[i][j]表示当a[i] == b[j]时以a[i]结尾的相同子序列个数.

//#pragma comment(linker, "/STACK:102400000, 102400000")
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
typedef long long LL;
typedef pair <int, int> P;
const int N = 1e3 + 5;
//dp[i][j]表示a[i]b[j]之前的所有相同的自序列个数
//cnt[i][j]表示当a[i] == b[j]时以a[i]结尾的相同子序列个数
LL dp

, cnt

;
LL a
, b
;
LL mod = 1e9+7;
int main()
{
int n, m;
while(~scanf("%d %d", &n, &m)) {
for(int i = 1; i <= n; ++i)
scanf("%lld", a + i);
for(int i = 1; i <= m; ++i)
scanf("%lld", b + i);
memset(dp, 0, sizeof(dp));
memset(cnt, 0, sizeof(cnt));
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= m; ++j) {
if(a[i] == b[j])
cnt[i][j] = (dp[i - 1][j - 1] + 1) % mod;
dp[i][j] = ((dp[i][j - 1] + dp[i - 1][j] - dp[i - 1][j - 1]) % mod + cnt[i][j]) % mod;
}
}
printf("%lld\n", (dp
[m] + mod) % mod);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: