大致题意: 给你一个\(2*n\)的扫雷棋盘,现让你根据第二列的信息确定第一列有多少种摆法。
扫雷性质
听说这是一道动态规划+数学题。
其实,根据扫雷游戏的某个性质,只要确定了第一个格子是否有雷,就可以确定整列雷的分布情况!
因此,最多只可能有两种摆法。
这样一来,只要对第一个格子是否有雷分类讨论即可,遇到合法的情况就将\(ans\)加\(1\)。
如何确定整列雷的分布情况
我们再来说一下应如何根据第一个格子是否有雷来确定整列雷的分布情况。
我们可以用\(a_i\)来存储第二列的信息,并用\(s_i\)来表示第\(i\)位是否有雷。
则对于第\(x\)位,不难发现\(s_{x-2}+s_{x-1}+s_x=a_{x-1}\)。
由于\(a_{x-1}\)是题目给出的,所以确定了\(s_{x-2}\)和\(s_{x-1}\),我们就可以得到\(s_x=a_{x-1}-s_{x-2}-s_{x-1}\)。
然后,我们就可以对\(s_x\)是否合法进行判断,从而判断是否存在不合法情况。
代码
#include#define max(x,y) ((x)>(y)?(x):(y))#define min(x,y) ((x)<(y)?(x):(y))#define uint unsigned int#define LL long long#define ull unsigned long long#define swap(x,y) (x^=y,y^=x,x^=y)#define abs(x) ((x)<0?-(x):(x))#define INF 1e9#define Inc(x,y) ((x+=(y))>=MOD&&(x-=MOD))#define ten(x) (((x)<<3)+((x)<<1))#define N 10000using namespace std;int n,a[N+5],s[N+5];class FIO{ private: #define Fsize 100000 #define tc() (FinNow==FinEnd&&(FinEnd=(FinNow=Fin)+fread(Fin,1,Fsize,stdin),FinNow==FinEnd)?EOF:*FinNow++) #define pc(ch) (FoutSize