Atcoder Grand Contest 031B(DP,思维)
#include<bits/stdc++.h>
using namespace std;
int a[200007];
int b[200007];
long long dp[200007];
long long sum[200007];
const long long mod =1e9+7;
int main(){
dp[0]=1;
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int cnt=0;
for(int i=1;i<=n;i++) {
if(a[i]!=a[i-1])
b[++cnt]=a[i];//缩点
}
for(int i=1;i<=cnt;i++){
dp[i]=dp[i-1];//i这个点不染色
dp[i]=(dp[i]+sum[b[i]])%mod;//sum[b[i]]如果i这点染色多出的情况
sum[b[i]]=(sum[b[i]]+dp[i-1])%mod;//sum[b[i]]记录了每一个b[i]颜色前面i-1有多少种情况(包括什么都不染)
}
printf("%lld",dp[cnt]);
return 0;
}
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)