首页 > 其他 > 详细

P2327

时间:2018-01-20 20:24:51      阅读:258      评论:0      收藏:0      [点我收藏+]

 

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

P2327

原文:https://www.cnblogs.com/qdscwyy/p/8321738.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!