bzoj P1088

这道题看似是一道dp,但是实则不是,而是一道很水的题。。。

对于我这种扫雷的老玩家,都知道扫雷其实是推理游戏。。

设第二列第i项为f[i],则f[i]依赖于a[i-1]和a[i]和a[i+1]。。

所以可以暴力判断一下f[1]的值:

f[1]=0:a[1]=0,a[2]=0;

f[1]=2:a[1]=1,a[2]=1;

f[1]=1:有两种情况:

1、a[1]=0,a[2]=1;

2、a[1]=1,a[2]=0;

于是,写一个check函数,检查一下枚举的正确性,输出就行了。。

#include<bits/stdc++.h>

using
namespace std;
int ans,n,f[10010],a[10010];
int solve(){
for(int i=3;i<=n;i++){
a[i]
=f[i-1]-a[i-1]-a[i-2];
if(a[i]>1||a[i]<0)return 0;
}
if(f[n]!=a[n-1]+a[n]) return 0;
return 1;
}
int main(){
scanf(
"%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&f[i]);
if(f[1]==2) a[1]=1,a[2]=1,ans=solve();
else if(f[1]!=0){
a[
1]=0;a[2]=1;ans=solve();
a[
1]=1;a[2]=0;ans+=solve();
}
else ans=solve();
printf(
"%d",ans);
return 0;
}

 

posted @ 2017-10-17 19:02  Accelerator-D-x  阅读(...)  评论(... 编辑 收藏