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;
}