P2327 [SCOI2005]扫雷
题目描述
输入输出格式
输入格式:
第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<=N<=10000)
输出格式:
一个数,即第一列中雷的摆放方案数。
输入输出样例
输入样例#1:
2
1 1
输出样例#1:
2
做法:
题解区大家都是八仙过海.
我想了一种比较恶心但是能过的方法.比题解区某些做法要好一点点.
首先需要分析一下这个题目,经过一番脑洞之后发现答案必定 大于0小于等于2 根据这个原理我们就可以大力模拟或者是搜索.
当然也可以 dp .万物皆可dp
然后这个做法就是 dp 做法.
$$f[i][j][k]表示当前位置为 i ,当前位置是不是雷(用j表示),下一位置需不需要是雷(k)的方案数.$$
转移就根据上一位置的选择.
#include<iostream> #include<cstdio> #define N 10005 using namespace std; void read(int &s){ char ch=getchar(); for(;!isdigit(ch);ch=getchar()); for(s=0;isdigit(ch);s=s*10+ch-'0',ch=getchar()); } int n; int g[N]; int f[N][2][2]; int main(){ read(n); for(int i=1;i<=n;++i)read(g[i]); f[0][0][0]=f[0][0][1]=1; for(int i=1;i<=n;++i){ if(g[i]==0){ f[i][0][0]+=f[i-1][0][0]; } if(g[i]==1){ f[i][0][0]+=f[i-1][1][0]; f[i][1][0]+=f[i-1][0][1]; f[i][0][1]+=f[i-1][0][0]; } if(g[i]==2){ f[i][1][1]+=f[i-1][0][1]; f[i][0][1]+=f[i-1][1][0]; f[i][1][0]+=f[i-1][1][1]; } if(g[i]==3) f[i][1][1]+=f[i-1][1][1]; } printf("%d",f[n][0][0]+f[n][1][0]); return 0; }