#include <iostream>
using namespace std;
int a[1001000][4],n,turn[4]={-1,0,1},ans;
int check(int x){
int sum=0;
for(int i=0;i<3;i++){
if(x+turn[i]>0&&x+turn[i]<=n){
if(a[x+turn[i]][1]) sum++;
}
}
return sum;
}
void dfs(int x){
if(x==n+1){
if(a[x][2]==0) ans++;
return;
}
int temp=check(x);
if(temp>a[x][2]) return;
if(temp==a[x][2]){
dfs(x+1);
return;
}
for(int i=0;i<a[x][2]-temp;i++){
int x1=x-1,x2=x-2;
if(x1<1) x1=1;
if(x2<1) x2=1;
for(int j=0;j<3;j++){
int xx=x+turn[j];
if(xx>0&&xx<=n&&!a[xx][1]){
a[xx][1]=1;
if(check(x1)==a[x1][2]&&check(x2)==a[x2][2]) dfs(x+1);
a[xx][1]=0;
}
}
}
return;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int temp;
cin>>temp;
a[i][2]=temp;
if(temp==3){
for(int j=0;j<3;i++){
a[i+turn[j]][1]=1;
}
}
}
dfs(1);
cout<<ans;
return 0;
}
除了四个点AC外,其他点全部RE,如果把数组开大的话就会MLE,求大佬指点!!