题意:找出一个序列全部子序列的个数
思路:直接暴力找不行,因为有相同的元素。
要用dp的思想去找。
令f[i] = 前i个元素的全部子序列。
又分为以下两种情况
- 当第i个元素在之前从来没有出现过时,f[i] = f[i-1] + f[i-1] +1。因为f[i-1] 就是一个子序列集合,另外再在他们后面加一个元素又是f[i-1],最后那个元素本身也是一个序列。
- 当第i个元素在之前出现过时, f[i] = f[i-1] + f[i-1] - f[ i元素最后一次出现的位置 -1] , 第一个f[i-1]没有问题,但是第二个之中会有重复的情况,也就是i 元素顶替上一个相同元素出现在子序列时的重复情况,需要减出来。
代码
#include<bits/stdc++.h>
#define MOD 1000000007
#define MAXN 1000005
typedef long long LL;
LL f[MAXN];
int last[MAXN],a,n;
int main()
{
while(~scanf("%d",&n))
{
memset(last,0,sizeof(last));
f[0]=0;
for(int i=1;i<=n;++i)
{
scanf("%d",&a);
f[i]=(f[i-1]<<1)%MOD;
if(!last[a]) last[a]=i,f[i]++;
else f[i]=(f[i]-f[last[a]-1]+MOD)%MOD,last[a]=i;
}
printf("%lld\n",f[n]%MOD);
}
return 0;
}