FZU 2129 子序列个数 (递推dp)

Posted Recoder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FZU 2129 子序列个数 (递推dp)相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2129

dp[i]表示前i个数的子序列个数

当a[i]在i以前出现过,dp[i] = dp[i - 1]*2 - dp[pre - 1],pre表示a[i]在i之前的位置

当a[i]在i以前没有出现过,dp[i] = dp[i - 1] *2 + 1

 1 //#pragma comment(linker, "/STACK:102400000, 102400000")
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <vector>
 8 #include <cmath>
 9 #include <ctime>
10 #include <list>
11 #include <set>
12 #include <map>
13 using namespace std;
14 typedef long long LL;
15 typedef pair <int, int> P;
16 const int N = 1e6 + 5;
17 LL dp[N], mod = 1e9 + 7, pre[N];
18 
19 int main()
20 {
21     int n, num;
22     while(~scanf("%d", &n)) {
23         memset(pre, 0, sizeof(pre));
24         for(int i = 1; i <= n; ++i) {
25             scanf("%d", &num);
26             if(pre[num]) {
27                 dp[i] = ((dp[i - 1]*2 - dp[pre[num] - 1]) % mod + mod) % mod;
28             } else {
29                 dp[i] = (dp[i - 1]*2 + 1) % mod;
30             }
31             pre[num] = i;
32         }
33         printf("%lld\n", dp[n]);
34     }
35     return 0;
36 }

 

以上是关于FZU 2129 子序列个数 (递推dp)的主要内容,如果未能解决你的问题,请参考以下文章

子序列(混合递推+前缀和 || 分块)

golang必备算法动态规划 Letecode 516.最长回文子序列

dp--P1439 最长公共子序列(LCS)

1202 子序列个数(DP)

[算法模版]子序列DP

673. 最长递增子序列的个数(dp)