P2327

 

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;
}

posted @ 2018-01-20 19:48  Grary  阅读(160)  评论(0编辑  收藏  举报
博客园 首页 私信博主 编辑 关注 管理 新世界