FZU 2129 子序列个数 (递推dp)
2016-09-16 15:22
344 查看
题目链接: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
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
//#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 = 1e6 + 5; LL dp , mod = 1e9 + 7, pre ; int main() { int n, num; while(~scanf("%d", &n)) { memset(pre, 0, sizeof(pre)); for(int i = 1; i <= n; ++i) { scanf("%d", &num); if(pre[num]) { dp[i] = ((dp[i - 1]*2 - dp[pre[num] - 1]) % mod + mod) % mod; } else { dp[i] = (dp[i - 1]*2 + 1) % mod; } pre[num] = i; } printf("%lld\n", dp ); } return 0; }
相关文章推荐
- FZUProblem 2129 子序列个数(dp)
- FZU 2129 子序列个数(DP)
- fzu - 2129 - 子序列个数(dp)
- fzu 2129 子序列个数 (dp)
- FZU2129 子序列个数(dp求不同子序列个数)
- FZU 2129 子序列个数(计数DP)
- fzu—— Problem 2129 子序列个数
- FZU 2129 子序列个数 (动态规划)
- FZU 2129 子序列个数
- FZU 2129 - 子序列个数 维护前缀和,思维题..
- FZU 2129 子序列个数 (动态规划)
- FZU 2129 子序列个数
- 子序列个数(fzu2129)
- FZU 2170 花生的序列【dp+滚动数组】
- 子序列个数(fzu2129)
- fzu 2109 Mountain Number 数位DP 递推
- fzu - 2129 - 子序列个数
- fzu Problem 2129 子序列个数
- FZU 2129 子序列个数
- FZU 2129 子序列个数 (动态规划)