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个人训练赛第十五场)

markdown AtCoder Grand Contest 016

AtCoder Grand Contest 005

AtCoder Grand Contest 006

AtCoder Grand Contest 008 题解