zoukankan      html  css  js  c++  java
  • 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;
    }
    

  • 相关阅读:
    【ecshop】 完全清除版权信息
    【ecshop】使用sql 清除测试数据
    Java异常处理:给程序罩一层保险
    想清楚你究竟想成为什么样的人了吗?
    Java集合类的那点通俗的认知
    2019年的第一天,我给自己定了一份读书计划
    Java的内部类真的那么难以理解?
    29岁了还一事无成是人生的常态?
    Java接口的实例应用:致敬我的偶像——何塞·穆里尼奥
    程序员年底众生相
  • 原文地址:https://www.cnblogs.com/qdscwyy/p/8321738.html
Copyright © 2011-2022 走看看