基准时间限制:1 秒 空间限制:131072 KB
子序列的定义:对于一个序列a=a[1],a[2],......a[n]。则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列,其中1<=p1<p2<.....<pm<=n。
例如4,14,2,3和14,1,2,3都为4,13,14,1,2,3的子序列。对于给出序列a,有些子序列可能是相同的,这里只算做1个,请输出a的不同子序列的数量。由于答案比较大,输出Mod 10^9 + 7的结果即可。
Input
第1行:一个数N,表示序列的长度(1 <= N <= 100000) 第2 - N + 1行:序列中的元素(1 <= a[i] <= 100000)
Output
输出a的不同子序列的数量Mod 10^9 + 7。
Input示例
4 1 2 3 2
Output示例
13
思路:dp.dp[i]表示前i个数字能组成的不同子序列,那么考虑当前的值是否在以前出现过,没出现的话就是dp[i]=2*dp[i-1]+1,出现就为2*dp[i-1]- dp[id[ans[i]]-1]后一个为前面一个和当前值相同的前一位。
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<stdlib.h> 5 #include<queue> 6 #include<string.h> 7 #include<set> 8 #include<map> 9 #include<math.h> 10 using namespace std; 11 int ans[1000005]; 12 const int mod = 1e9+7; 13 typedef long long LL; 14 LL dp[1000005]; 15 int id[1000005]; 16 map<int,int>my; 17 int main(void) 18 { 19 int n; 20 while(scanf("%d",&n)!=EOF) 21 { 22 for(int i = 1; i <= n; i++) 23 { 24 scanf("%d",&ans[i]); 25 } 26 memset(dp,0,sizeof(dp)); 27 memset(id,0,sizeof(id)); 28 for(int i = 1; i <= n; i++) 29 { 30 if(!id[ans[i]]) 31 { 32 dp[i] = 2*dp[i-1]%mod + 1; 33 dp[i] %= mod; 34 id[ans[i]] = i; 35 } 36 else 37 { 38 dp[i] = (2*dp[i-1]%mod - dp[id[ans[i]]-1])%mod+mod; 39 dp[i]%=mod; 40 id[ans[i]] = i; 41 } 42 } 43 printf("%lld ",dp[n]); 44 } 45 return 0; 46 }