Atcoder Grand Contest 031B(DP,思维)
Posted ldudxy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}
以上是关于Atcoder Grand Contest 031B(DP,思维)的主要内容,如果未能解决你的问题,请参考以下文章
AtCoder Grand Contest 031 (AGC031) F - Permutation and Minimum 动态规划
AtCoder Grand Contest 031(UPC个人训练赛第十五场)