好看序列

Sxdxfz-OJ 1003: 好看序列 看到难度标着基础就去做了,结果思考了很久…… 第一反应暴力,然而一看范围,最多2000个数字((
想到可以每添加一个数字处理一次,于是研究O(n)算法 一开始的思路是分情况讨论,对于每个新输入的数字判断是否与之前相等之类
然而打了很久的表只拿了9%的分。。。。 转变思路,思考每一个新加入的数字与之前的关系,记录每个数字结尾共有多少种方法 一共有sum种方案,数字n结尾有a[n]种方案
新加入数字n后,a[n]的值=之前不以n结尾方案+之前以n结尾+单独n存在的方案(1)
即新加入后,a[n]=sum+1 于是有了下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>
#define rint register int
using namespace std;
inline int read(){
rint a=1,b=0;char c;
do{c=getchar();if(c=='-')a=-1;}while(c>'9'c<'0');
do{b=b*10+c-'0';c=getchar();}while(c>='0'&&c<='9');
return a*b;
}

int a[50000+10];

int main(){
rint T,n,tmp,sum=0;
T=read();
while(T--){
n=read();
tmp=a[n];
a[n]=sum+1;
sum=sum-tmp+a[n];
a[n]=a[n]>1000000007
?a[n]%1000000007
:a[n];
sum=sum<0
?sum+1000000007
:sum>1000000007
?sum%1000000007
:sum;
}
printf("%d",sum);
return 0;
}