[SCOI2005]扫雷

题目描述

输入输出格式

输入格式:

 

第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<= N <= 10000)

 

输出格式:

 

一个数,即第一列中雷的摆放方案数。

 

输入输出样例

输入样例#1:
2
1  1
输出样例#1:
2

这题神套路..答案只有三种0,1,2
因为只要第一个的状态确定了之后,后面的要么无解,要么只有一种解.
因为每个点要么有雷要么无雷.
所以就可以先枚举第一个点是否有雷,然后DP判断是否有解.
每个点的雷数f[i]=a[i-1]-f[i-1]-f[i-2].
若算出来不是01就无解了.

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<string>
 6 #include<algorithm>
 7 #include<map>
 8 #include<complex>
 9 #include<queue>
10 #include<stack>
11 #include<cmath>
12 #include<set>
13 #include<vector>
14 #define maxn 10010
15 using namespace std;
16 int f[maxn],a[maxn],n;
17 inline bool check(){
18   for(int i=2;i<=n;i++){
19     f[i]=a[i-1]-f[i-1]-f[i-2];
20     if(f[i]!=0 && f[i]!=1) return 0;
21   }
22   if(f[n]+f[n-1]!=a[n]) return 0;
23   return 1;
24 }
25 int main(){
26   int ans=0;
27   scanf("%d",&n);
28   for(int i=1;i<=n;i++)
29     scanf("%d",&a[i]);
30   f[1]=0;
31   if(check())ans++;
32   memset(f,0,sizeof(f));
33   f[1]=1;
34   if(check())ans++;
35   printf("%d",ans);
36   return 0;
37 }

 

posted @ 2017-09-10 22:36  嘘丶  阅读(160)  评论(0编辑  收藏  举报