[SCOI2005]扫雷

Posted 蒟蒻ZJO :-)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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 }

 







以上是关于[SCOI2005]扫雷的主要内容,如果未能解决你的问题,请参考以下文章

[SCOI2005]扫雷

bzoj1088 [SCOI2005]扫雷

BZOJ-1088: [SCOI2005]扫雷Mine ()

bzoj 1088: [SCOI2005]扫雷Mine

bzoj1088[SCOI2005]扫雷Mine

bzoj1088 [SCOI2005]扫雷Mine