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

  • 相关阅读:
    [Outlook] Outlook2013能收但无法发送邮件-0x800CCC13, 0x800CCC0B, 0x8004210B
    [Mobile] 手机浏览器输入框-数字输入框
    [Qcon] 百姓网开发总结
    [QCon] Scrum阅读随想
    [Spring] 事务级别定义
    [Monitor] 监控规则定义
    [Spring Batch] 图解Spring Batch原理
    [JavaCore] 微信手机浏览器版本判断
    Python 编码简单说
    矩阵或多维数组两种常用实现方法
  • 原文地址:https://www.cnblogs.com/qdscwyy/p/8321738.html
Copyright © 2020-2023  润新知