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. java数据提交时问题

    form 表单中的action有参数时,当method为get时,servlet无法获取该参数 ajax提交数据,servlet无法进行请求转发和重定向. ${pageContext.request. ...

  2. python赋值,深拷贝和浅拷贝的区别

    1.赋值 list1=[[1,2],'fei',66] list2=list1 list1 [[1, 2], 'fei', 66] list2 [[1, 2], 'fei', 66] list2.ap ...

  3. 二、Nginx 服务器升级

      1,编译新版本的nginx 软件 [root@client lnmp_soft]# tar -xf nginx-1.12.2.tar.gz -C .. [root@client lnmp_soft ...

  4. UF_LAYOUT 布局相关

    Open C uc6460uc6462uc6463uc6464  根据视图名称旋转视图,在布局中替换视图uc6466uc6467uc6468uc6469uc6470uc6471uc6472uc6473

  5. 《手把手教你》系列基础篇之(一)-java+ selenium自动化测试-环境搭建(上)(详细教程)

    1.简介 jmeter系列的文章结束,本来想趁热打铁顺别将Jmeter和接口测试介绍一下,但是感觉Jmeter时间太长了怕大家吃腻了,还有一个原因就是许多小伙伴们或者童鞋们私信问宏哥什么时候可以有ja ...

  6. 微信sdk上传图片大小1k,损坏的问题以及微信上传图片需要的配置

    微信公众号的appid和appsecret有问题,会导致上传图片大小为1k这个问题 微信上传图片需要设置公众号的'JS接口安全域名'

  7. java特点了解及JDK初谈

    java特性: 1.跨平台:主要是指字节码文件可以在任何具有Java虚拟机的计算机或者电子设备上运行,Java虚拟机中的Java解释器负责将字节码文件解释成为特定的机器码进行运行. 2.简单:相比与C ...

  8. 试着给VuePress添加登录授权支持,基于v-dialogs

    背景介绍 VuePress是个不错的能基于Markdown快速构建静态网站的框架,初步来说,对外访问都是透明的. 但是可能因为一些保密需要,有些站点的文档,我们希望控制一下访问,所以我们借着别人的轮子 ...

  9. 尝试用面向对象思维理解Vue组件

    什么是组件 用面向对象的思维去理解Vue组件,可以将所有的事物都抽象为对象,而类或者说是组件,都具有属性和操作. 如抽取人类为组件,其基本的属性有姓名.年龄.国籍:基本的方法有吃饭.睡觉.跑步等. & ...

  10. 删除有序数组中的重复项II

    题目描述 给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素最多出现两次,返回删除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组 并在使用O(1)额外空间的条件下 ...