【51Nod1202】子序列个数

来源:互联网 发布:乐高ev3机器人编程软件 编辑:程序博客网 时间:2024/06/05 10:35

子序列的定义:对于一个序列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[i]表示到i为止有多少个逆序对,记录一下前一个相同的数出现的位置。

代码

#include<bits/stdc++.h>#define N 500005#define ll long long#define inf 100000000#define mod 1000000007using namespace std;inline int read(){    int x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}int n,dp[100005],last[100005];int main(){    n=read();    for (int i=1;i<=n;i++)    {        int x=read();        dp[i]=(dp[i-1]*2+1)%mod;        if (last[x]) dp[i]=((dp[i]-1-dp[last[x]-1])%mod+mod)%mod;        last[x]=i;    }    printf("%d",dp[n]);    return 0;}
原创粉丝点击