只有两列,知道第一个是否放雷就可以推出剩下的了,判断合法即可。
复杂度O(n)
#include<iostream> #include<cstdio> using namespace std; inline int rd(){ int ret=0,f=1;char c; while(c=getchar(),!isdigit(c))f=c=='-'?-1:1; while(isdigit(c))ret=ret*10+c-'0',c=getchar(); return ret*f; } const int MAXN=1000005; int f[MAXN],a[MAXN]; int n,ans; int main(){ n=rd(); for(int i=1;i<=n;i++){ a[i]=rd(); } for(f[1]=0;f[1]<=1;f[1]++){ int flag=1; for(int j=2;j<=n;j++){ f[j]=a[j-1]-f[j-1]-f[j-2]; if(f[j]<0) flag=0; } if(f[1]+f[2]!=a[1]) flag=0; if(f[n]+f[n-1]!=a[n]) flag=0; ans+=flag; } cout<<ans; }