Codeforces Round #518 (Div. 2) D(计数DP)
Posted ldudxy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}
以上是关于Codeforces Round #518 (Div. 2) D(计数DP)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #518 (Div. 2) D(计数DP)
Codeforces Round #518 (Div. 1) Computer Game 倍增+矩阵快速幂
Codeforces Round #436 E. Fire(背包dp+输出路径)
[ACM]Codeforces Round #534 (Div. 2)