题目:BZOJ1088、洛谷P2327、Vijos P1193、codevs2452。
题目大意:经典的扫雷游戏(不要告诉我你连扫雷都没玩过),右边一排没有雷,给出右边一排的信息,求左边一排有多少种满足条件的摆雷方案。
解题思路:我们发现,只要知道左边一排第一格有没有雷,就可以根据右边一排推出下面所有的雷。推出来以后我们只要判断是否满足右边一排最后一格的条件即可。简单的递推。
C++ Code:
#include<cstdio> #include<cstring> using namespace std; int a[10002],n,ans; int f[10002]; void pd(){ for(int i=2;i<=n;++i){ int cnt=f[i-1]+f[i-2]; if(cnt>a[i-1]||a[i-1]-cnt>1)return; f[i]=a[i-1]-cnt; } if(f[n]+f[n-1]!=a[n])return; ans++; } int main(){ scanf("%d",&n); ans=0; for(int i=1;i<=n;++i) scanf("%d",&a[i]); f[0]=0; for(f[1]=0;f[1]<2;++f[1])//枚举第一格有没有雷 pd(); printf("%d ",ans); return 0; }