【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;}
阅读全文
0 0
- 51Nod1202子序列个数
- 【51Nod1202】子序列个数
- 【51Nod1202】子序列个数(简单dp)
- 【子序列个数】51nod 1202 子序列个数
- 子序列个数 51Nod
- 51nod1202(递推)
- 51nod 1202:子序列个数
- 51nod 1202 子序列个数
- 51nod 1202 子序列个数
- 51nod 1202 子序列个数
- 51Nod 1202 子序列个数
- 51nod 1202 子序列个数
- 51Nod 1202 子序列个数
- 51nod-1202-子序列个数
- 子序列的个数
- 子序列个数
- 子序列个数
- 子序列个数
- 过滤器的使用(一)
- MySQL数据类型
- 【LeetCode】1.Two Sum思路以及知识点复习
- android 自定义组件
- div水平垂直居中的方法
- 【51Nod1202】子序列个数
- Python安装第三方库(macOS)
- 流水灯程序
- My eclipse 2017 Stable 1.0 安装破解方法
- Java数组的引用
- 栈、队列、优先队列笔记
- 关于mysql日志的一些参数
- Eclipse——打开eclipse,报错:找不到java虚拟机
- Android Studio装B大全