题目链接:http://www.51nod.com/Challenge/Problem.html#!#problemId=1202
题目大意:给你一个序列,求它子序列的个数(不包含空集)
直接dp:dp[i]前i个数的子序列个数。
数字a[i]没有出现过:dp[i-1]的子序列+(有a[i]+没有a[i])
dp[i]=dp[i-1]+dp[i-1]
数字a[i]出现最近的位置位j:那么dp[j-1]和a[i]的组合重复了,要减去
dp[i]=dp[i-1]+dp[i-1]-dp[j-1];
边界条件:dp[0]=1:空集
输出时-1//减去空集
#include <bits/stdc++.h>
#define mod 1000000007
using namespace std;
int a[100005];
int s[100005]={0};
int dp[100005]={0};
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
dp[0]=1;
for(int i=1;i<=n;i++)
{
dp[i]=(dp[i-1]*2)%mod;//如果没有出现过
if(s[a[i]]>0)//如果出现过
{
dp[i]=(dp[i]-dp[s[a[i]]-1]+mod)%mod;;
}
s[a[i]]=i;//记录位置
}
printf("%d\n", dp[n]-1);//减去空集
return 0;
}