#include<cstdio>#include<cstring>#define N 20001#define M 1000000007long a[N];
longlong f[2][2*N+1];int main()
{ long n,i,j,h,now;bool t;freopen("brick.in","r",stdin);freopen("brick.out","w",stdout);scanf("%ld",&n);a[0]=-1;for(i=1;i<=n;i++){scanf("%ld",&a[i]);}now=0;h=-1;for(i=1;i<=n;i++){if(i<=n/2+1)h++;else h--;memset(f[now],0,sizeof(f[now]));if(i==1){if(a[i]<=0)f[now][0]=1;elsebreak;}elseif(a[i]==-1){for(j=h;j>=0;j--)f[now][j]=(f[now^1][j+1]+f[now^1][j]+f[now^1][j-1])%M;}else{f[now][a[i]]=(f[now^1][a[i]+1]+f[now^1][a[i]]+f[now^1][a[i]-1])%M;}now^=1;}printf("%ld\n",f[now^1][0]);return0;
}
正解 time:8ms code by:ypx大佬
#include <bits/stdc++.h>#define N 20005#define MOD 1000000007typedeflonglong ll;int read()
{int x = 0, f = 1;char ch = getchar();while (ch < '0' || ch > '9') {if (ch == '-') f = -1; ch = getchar();}while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}return x * f;
}ll pow(int x,int y)
{ll res = 1;while (y){if (y & 1)res = (ll)res * x % MOD;x = (ll)x * x % MOD;y >>= 1;}return res;
}int jc[N + 5], ny[N + 5];void pre()
{jc[0] = 1;for (int i = 1; i <= N; i++){jc[i] = (ll)jc[i - 1] * i % MOD;}for (int i = 0; i <= N; i++){ny[i] = pow(jc[i], MOD - 2);}
}ll C(int n,int m)
{if (m > n)return0;return ll(jc[n]) * ny[m] % MOD * ny[n - m] % MOD;
}int h[N + 5];
int f[N + 5];int main()
{freopen("brick.in","r",stdin);freopen("brick.out","w",stdout);int n = read();for (int i = 1; i <= n; i++)h[i] = read();if (h[1] > 0 || h[n] > 0){printf("0\n");return0;}pre();h[1] = 0, h[n] = 0;f[1] = 1;for (int i = 2, j = 1; i <= n; i++)if (h[i] >= 0){int H = abs(h[i] - h[j]);for (int k = 0; k <= i - j - H; k++){int l = (i - j - k);if ((l + H) % 2 == 0)f[i] += ll((C(l,(l + H) >> 1) - C(l, (l + h[i] + h[j] + 2) >> 1) + MOD) % MOD) * C(i - j, k) % MOD, f[i] %= MOD;}f[i] = (ll(f[i]) * (f[j])) % MOD;j = i;}printf("%d\n",f[n]);
}