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]结尾的相同子序列个数.
题目问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; }
相关文章推荐
- hdu 5791 Two (dp)
- DP——Two ( HDU 5791 ) ( 2016 Multi-University Training Contest 5 1011 )
- HDU - 5791 Two 简单 dp
- HDU_5791_Two(简单dp)
- HDU 5791 Two (DP)
- hdu-5791 Two(dp)
- HDU 5791 Two(DP)2016 Multi-University Training Contest 5
- HDU 5791 Two(DP)
- HDU-5791-Two(DP)
- HDU 5791 Two(dp)
- HDU 5791 Two ( DP )
- HDU 5791 Two (DP)
- HDU-5791-TWO-DP
- hdu 5791 Two(2016 Multi-University Training Contest 5——DP)
- 51nod 1202 子序列个数 (子序列套路dp)&& HDU 5791 Two (两串求相同子序列)
- hdu_5791_Two(DP)
- HDU 5791 Two (DP)
- HDU 5791 Two——DP
- HDU 5791 Two (DP)
- hdu 5791 Two