zoukankan      html  css  js  c++  java
  • Codeforces Round #518 (Div. 2) D(计数DP)

    #include<bits/stdc++.h>
    using namespace std;
    const long long mod=998244353;
    int n;
    int a[100007];
    long long dp[100007][207][3];//第i位值为j时k是否成立,k=0,i<i-1,k=1,i==i-1,k=2,i>i-1


    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=200;i++){
            if(a[1]!=-1&&a[1]!=i)
                dp[1][i][0]=0;
            else
                dp[1][i][0]=1;
            dp[1][i][1]=dp[1][i][2]=0;
        }
        long long sum=0;
        for(int i=2;i<=n;i++){
            sum=0;
            for(int x=1;x<=200;x++){
                if(a[i]!=-1&&a[i]!=x)
                    dp[i][x][0]=0;
                else
                    dp[i][x][0]=sum;
                sum+=(dp[i-1][x][0]+dp[i-1][x][1]+dp[i-1][x][2])%mod;
                sum%=mod;
            }
            for(int x=1;x<=200;x++){
                if(a[i]!=-1&&a[i]!=x)
                    dp[i][x][1]=0;
                else
                    dp[i][x][1]=(dp[i-1][x][0]+dp[i-1][x][1]+dp[i-1][x][2])%mod;
            }
            sum=0;
            for(int x=200;x>=1;x--){
                if(a[i]!=-1&&a[i]!=x)
                    dp[i][x][2]=0;
                else
                    dp[i][x][2]=sum;
                sum+=(dp[i-1][x][1]+dp[i-1][x][2])%mod;
                sum%=mod;
            }
        }
        long long ans=0;
        for(int i=1;i<=200;i++)
            ans+=(dp[n][i][1]+dp[n][i][2])%mod,ans%=mod;
        printf("%lld",ans);
        return 0;

    }

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    python数据结构之树(二叉树的遍历)
    python数据结构之树(概述)
    python面向对象高级:定制类
    python面向对象高级:Mixin多重继承
    frp
    CentOS7 安装远程桌面
    Java-JVM 锁优化
    Java-内存模型 synchronized 的内存语义
    Java-内存模型 final 和 volatile 的内存语义
    Java-内存模型(JSR-133)
  • 原文地址:https://www.cnblogs.com/ldudxy/p/10030016.html
Copyright © 2011-2022 走看看