[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].
若算出来不是0或1就无解了.
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 }