FZU2129 子序列个数(dp求不同子序列个数)
2017-08-16 16:59
267 查看
dp[i]表示前i个数的不同子序列个数,对于a[i]
1.在之前没出现过,dp[i]=dp[i-1]+dp[i-1]+1
2.在之前出现过,最近的位置为x,dp[i]=dp[i-1]+dp[i-1]-dp[x-1]
1.在之前没出现过,dp[i]=dp[i-1]+dp[i-1]+1
2.在之前出现过,最近的位置为x,dp[i]=dp[i-1]+dp[i-1]-dp[x-1]
#include <cstdio> #include <cstring> #define N 1000010 int const mod=1e9+7; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } int n,a ,last ,h ,dp ; int main(){ // freopen("a.in","r",stdin); while(~scanf("%d",&n)){ memset(h,0,sizeof(h)); for(int i=1;i<=n;++i){ a[i]=read(); last[i]=h[a[i]];h[a[i]]=i; } for(int i=1;i<=n;++i){ if(!last[i]) dp[i]=dp[i-1]*2+1; else dp[i]=dp[i-1]+dp[i-1]-d 4000 p[last[i]-1]; if(dp[i]<0) dp[i]+=mod; dp[i]%=mod; } printf("%d\n",dp ); } return 0; }
相关文章推荐
- FZU 2129 子序列个数 (递推dp)
- FZUProblem 2129 子序列个数(dp)
- FZU 2129 子序列个数(计数DP)
- FZU 2129 子序列个数(DP)
- fzu - 2129 - 子序列个数(dp)
- fzu 2129 子序列个数 (dp)
- fzu 1570 集合划分问题 第二类斯特林数 n个不同小球放到m个相同的盒子的方法个数
- fzu - 2129 - 子序列个数
- FZU 2129 子序列个数
- FZU 2129 子序列个数
- Longest Ordered Subsequence与最少拦截系统 DP+贪心(最长上升子序列及最少序列个数)
- FZU 2129 子序列个数
- 求n个数排为一列后相邻数的差的绝对值不同的个数为K的序列
- HDU1029(去掉两个不同的数序列中出现频率最多的那个数不变)DP2
- hdu5791 Two(dp求公共子序列个数)
- HDU 5791 Two (dp求公共子序列个数)
- 子序列个数(fzu2129)
- Xtreme8.0 - Play with GCD dp,离散化 求一个序列里面gcd值等于x的集合个数
- fzu—— Problem 2129 子序列个数
- 子序列个数(fzu2129)