题目链接: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;
}