码迷,mamicode.com
首页 > 其他好文 > 详细

P2327

时间:2018-01-20 20:33:55      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:nts   .property   orm   mon   header   opacity   before   boolean   分享   

 

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

标签:nts   .property   orm   mon   header   opacity   before   boolean   分享   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!