bzoj 1088
设b数组表示这个位置有没有雷。
a[i]=b[i-1]+b[i]+b[i+1]。
b[3]=a[2]-b[2]-b[1]。
b[2]=a[1]-b[1]。
也就是说,只要知道b[1]就可以知道b[2]...b[n]的值。
于是直接枚举b[1]的值把b数组一个个推出来判断是否符合即可。
#include<cstdio> #include<cctype> #include<algorithm> using namespace std; const int maxn=10001; int read(){ char c; while(!isdigit(c=getchar())); int x=c-'0'; while(isdigit(c=getchar())) x=x*10+c-'0'; return x; } int a[maxn],b[maxn]; int main(){ int n=read(),ans=0; for(int i=1;i<=n;i+=1) a[i]=read(); for(int i=0;i<=1;i+=1){ b[1]=i; ans+=1; for(int j=2;j<=n;j+=1){ b[j]=a[j-1]-b[j-1]-b[j-2]; if(b[j]>1 || b[j]<0){ans--; goto next;} } if(b[n-1]+b[n]!=a[n]) ans--; next:; } printf("%d",ans); return 0; }