A:设f[i][j][0/1]为前i个数第i位为j且第i位未满足/已满足限制的方案数。大力dp前缀和优化即可。
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } #define N 100010 #define P 998244353 #define K 200 int n,a[N],f[N][K+1][2],g[N][K+1][2];//0 there is limit void inc(int &x,int y){x+=y;if (x>=P) x-=P;} int main() { #ifndef ONLINE_JUDGE freopen("a.in","r",stdin); freopen("a.out","w",stdout); #endif n=read(); for (int i=1;i<=n;i++) a[i]=read(); f[0][0][0]=1; for (int i=0;i<=K;i++) g[0][i][0]=1; for (int i=1;i<=n;i++) { if (a[i]!=-1) { inc(f[i][a[i]][1],(g[i-1][K][1]-g[i-1][a[i]-1][1]+P)%P); inc(f[i][a[i]][1],f[i-1][a[i]][0]); inc(f[i][a[i]][0],g[i-1][a[i]-1][0]),inc(f[i][a[i]][0],g[i-1][a[i]-1][1]); } else { for (int j=1;j<=K;j++) { inc(f[i][j][1],(g[i-1][K][1]-g[i-1][j-1][1]+P)%P); inc(f[i][j][1],f[i-1][j][0]); inc(f[i][j][0],g[i-1][j-1][0]),inc(f[i][j][0],g[i-1][j-1][1]); } } for (int j=1;j<=K;j++) g[i][j][0]=(f[i][j][0]+g[i][j-1][0])%P,g[i][j][1]=(f[i][j][1]+g[i][j-1][1])%P; } if (a[n]!=-1) cout<<f[n][a[n]][1]; else { int ans=0; for (int i=1;i<=200;i++) inc(ans,f[n][i][1]); cout<<ans; } return 0; }