第1行:一个数N,表示序列的长度(1 <= N <= 100000) 第2 - N + 1行:序列中的元素(1 <= a[i] <= 100000)
输出a的不同子序列的数量Mod 10^9 + 7。
4 1 2 3 2
13
设dp[i]表示前i个数的子序列个数。
若前i个数都不相同,dp[i]=dp[i-1]*2+1。(前i-1个数构成的子序列后面添加该数a[i]或者不添加,再加上仅由a[i]构成的子序列)
否则,dp[i]=dp[i-1]*2-dp[pre[a[i]]-1]。pre[a[i]]表示第i个数最后一次出现的位置。
#include<bits/stdc++.h> using namespace std; #define N 1000005 #define mod 1000000007 typedef __int64 LL; int a[N],pre[N]; LL dp[N]; int main() { int n,i; scanf("%d",&n); memset(pre,-1,sizeof(pre)); for(i=1;i<=n;++i) scanf("%d",&a[i]); for(i=1;i<=n;++i){ if(~pre[a[i]]) dp[i]=(dp[i-1]*2%mod-dp[pre[a[i]]-1]+mod)%mod; else dp[i]=(dp[i-1]<<1|1)%mod; pre[a[i]]=i; } printf("%I64d\n",dp[n]); return 0; }