CF404D-DP

正经的东西


题意

给定一个字符串,只包含'0','1','2','*','?'五种字符,其中'?'可被替换为其他任何一种,求使序列符合扫雷地图定义的方案数。

一个数字字符大小表示与之临近的位置总共有多少个雷。

思路

DP。

和其他题解不太相同,我们每个点只记录三种状态:0,1,2,分别表示此点的下一位不为雷、为雷,和本身就是雷的此位以前的方案数。

注意,这些状态除了最后一个,与该点本身为何没有关系。

考虑每一个点分别为何的情况下从上一个位置的什么状态转移:

  1. 为0:继承0.

    f[i][0]+=f[i-1][0]
  2. 为1:自身0的状态继承上一个为雷的状态,为1的继承为0的。

    f[i][0]+=f[i-1][2]
    f[i][1]++f[i-1][0]
  3. 为2:只能将自身为1的状态继承上一个为雷的状态。

    f[i][1]+=f[i-1][2]
  4. 为雷:继承上一个为1、为雷的状态。

    f[i][2]+=f[i-1][2]+f[i-1][1]
  5. 为?:将上述所有状态全部转移。

    f[i][0]+=f[i-1][0]+f[i-1][2]
    f[i][1]+=f[i-1][0]+f[i-1][2]
    f[i][2]+=f[i-1][1]+f[i-1][2]

至于上面转移的原因显然,即每个点后面的点能继承当前点的哪个状态。

  • 注意:初始化f[0][0]=f[0][1]=1,后者是为了计算第一位为雷的情况。此外,所有该点未被转移的状态都为0

于是我们线性DP求解即可。

不正经的东西


  • 首先,显然上面的第一维可以滚动数组优化。

  • 然后,我们可以边输入边计算,就不用数组存东西啦。这样我们将空间复杂度优化到了\(O(1)\)

  • 最后,你就会发现吾的做法即好想又好写又省时间又省空间

达成成就:内存使用小于代码大小

代码

#include<cstdio>
using namespace std;
const int mod=1e9+7;
int f[2][3];
int x,i;char c;
inline void qm(int &a,const int& b){(a+=b)>=mod?(a-=mod):a;}
int main(){
c=getchar();
while(c<=32)c=getchar();
f[0][0]=f[0][1]=1;
for(x=1;c>32;x++,c=getchar()){
i=x&1;
f[i][0]=f[i][1]=f[i][2]=0;
switch(c){
case '0':{
qm(f[i][0],f[i^1][0]);
break;
}
case '1':{
qm(f[i][1],f[i^1][0]);
qm(f[i][0],f[i^1][2]);
break;
}
case '2':{
qm(f[i][1],f[i^1][2]);
break;
}
case '*':{
qm(f[i][2],f[i^1][1]+f[i^1][2]);
break;
}
case '?':{
qm(f[i][0],f[i^1][0]);
qm(f[i][0],f[i^1][2]);
qm(f[i][1],f[i^1][0]);
qm(f[i][1],f[i^1][2]);
qm(f[i][2],f[i^1][1]);
qm(f[i][2],f[i^1][2]);
break;
}
}
}
x--;
printf("%d",(f[x&1][0]+f[x&1][2])%mod);
return 0;
}

CF404D-DP【成就达成】的更多相关文章

  1. GitHub 1W star 成就达成!

    起因 感谢各位大佬的支持收获了人生第一个(很有可能也是唯一一个)1W star 项目. 从今年一月份创建项目至今 8 个月时间. 一共关闭了 27 个 issue,47 个 RP,总共有 11 位小伙 ...

  2. POJ 2923 Relocation(状压DP+01背包)题解

    题意:给你汽车容积c1,c2,再给你n个包裹的体积,问你最少运几次能全运走 思路:用2进制表示每次运送时某物在不在此次运送之中,1在0不在.我们把运送次数抽象成物品价值,把状态抽象成体积,用一个dp[ ...

  3. My_Plan part1 小结

    数位DP AC十道题目以上 成就达成 八月份!三个月!想想就令人兴奋呢 开始写总结啦 貌似简单的数位DP只需要改改模板就可以啦 就按照我的做题顺序开始总结吧 先是学习了一发模板:http://www. ...

  4. CSP-S2020AFO记

    2020-10.11 考初赛辣. 选择题考了一堆时间复杂度,一个不会(卒) 我寻思这01背包哪里能用贪心? 啊,这,这,这手写快排竟如此简单,手写取Max,手写队列,两个字符串颠来倒去,竟活到爆! 震 ...

  5. gulp使用小结(一)

    这篇文章不会介绍 gulp 的起源.发展:不会去一个个讲解 gulp API:也不想出现大段大段的 gulpfile.js 代码:更木有帮你分析 gulp 实现原理,只有一些我自己对 gulp 的使用 ...

  6. No.5__C#

    One month 今天是个有纪念意义的日子,2015-4-23.今天是实习的第一个月,算是成就达成吧.虽然,除去了周末六日和清明什么的,只剩下20多天了,但是,还是好开心 啊,毕竟是第一次参加工作, ...

  7. gulp前端自动化构建工具使用

    (1)新建项目目录gulp_web (2)项目目录下建目录src里面存放需要进行gulp处理的文件目录及文件 (3)gulpfile.js文件内容为声明需要打包应用的gulp组件及打包文件路径和打包任 ...

  8. 一篇迟到的gulp文章

    前言 这篇文章本应该在去年17年写的,但因为种种原因没有写,其实主要是因为懒(捂脸).gulp出来的时间已经很早了,16年的时候还很流行,到17年就被webpack 碾压下去了,不过由于本人接触gul ...

  9. 游戏编程模式 Game Programming Patterns (Robert Nystrom 著)

    第1篇 概述 第1章 架构,性能和游戏 (已看) 第2篇 再探设计模式 第2章 命令模式 (已看) 第3章 享元模式 (已看) 第4章 观察者模式 (已看) 第5章 原型模式 (已看) 第6章 单例模 ...

随机推荐

  1. jvm调优神器——arthas

    在上一篇<jvm调优的几种场景>中介绍了几种常见的jvm方面调优的场景,用的都是jdk自带的小工具,比如jps.jmap.jstack等.用这些自带的工具排查问题时最大的痛点就是过程比较麻 ...

  2. 七、SSL加密网站(待解决)

    keytool -genkeypair -alias tomcat -keyalg RSA -keystore /usr/local/tomcat/keystore  //创建私钥和证书文件提示输入密 ...

  3. WordPress简介

    WordPress是什么? WordPress是一款免费开源的内容管理系统(CMS),目前已经成为全球使用最多的CMS建站程序.根据 W3techs 的最新统计(截至2021年4月),在全球的所有网站 ...

  4. 【模拟7.14】B. 熟练剖分(tree) (概率DP)

    一道概率神题,考试时没读清题考完看了学长的玄学题解看了好几个小时 首先f[i][j]表示在点 i 为根的子树中,向下最长轻链长度小于等于 j 的概率. 首先递归下去并求出子树大小,然后枚举重儿子,枚举 ...

  5. Linux查看与设定别名

    1.alias :查看系统中所有的命令别名 2.设定别名 alias 别名='原命令' 3.删除别名 unalias 别名 4.使别名永久生效    vi  ~/.bashrc  写入这个文件中即可永 ...

  6. 我的新书《C++服务器开发精髓》终于出版啦

    一.千呼万唤始出来 亲爱的各位读者,我的新书<C++ 服务器开发精髓>终于终于终于与大家见面了,图书如下: 图书的封面设计很精美,当然内容一定不负众望.因出版社老师要求提供一张照片放到封面 ...

  7. IDEA搭建一个SpringBoot项目——十分详细(web+mysql)

    ​前排提示: IDEA版本:IntelliJ IDEA 2021.1.1 专业版(是否为专业版影响不大) 搭建目的:前端web页面能够获取到MySQL数据库中的数据 详细步骤: 1. 创建一个新项目 ...

  8. 基于xtrabackup的主从同步

    基于xtrabackup的主从同步 作者 刘畅 时间 2020-9-21 服务器版本:CentOS Linux release 7.5.1804 主机名 ip地址 服务器配置 安装软件 密码 mysq ...

  9. Https:证书生成 .p12 .keyStore 和 .truststore文件理解

    当我们需要SSL证书时,可以自动生成SSL证书,但是每个系统都申请一次证书会比较麻烦,所以用到了如下几个文件格式:   .p12(PKCS #12) 我们的每一个证书都可以生成一个.p12文件,这个文 ...

  10. Maven:手动添加jar包进Maven本地库内

    正常maven依赖jar包的pom.xml写法如下: <!-- https://mvnrepository.com/artifact/ojdbc/ojdbc --><!-- (参数一 ...