CF404D-DP【成就达成】
CF404D-DP
正经的东西
题意
给定一个字符串,只包含'0','1','2','*','?'五种字符,其中'?'可被替换为其他任何一种,求使序列符合扫雷地图定义的方案数。
一个数字字符大小表示与之临近的位置总共有多少个雷。
思路
DP。
和其他题解不太相同,我们每个点只记录三种状态:0,1,2,分别表示此点的下一位不为雷、为雷,和本身就是雷的此位以前的方案数。
注意,这些状态除了最后一个,与该点本身为何没有关系。
考虑每一个点分别为何的情况下从上一个位置的什么状态转移:
为0:继承0.
f[i][0]+=f[i-1][0]
为1:自身0的状态继承上一个为雷的状态,为1的继承为0的。
f[i][0]+=f[i-1][2]
f[i][1]++f[i-1][0]
为2:只能将自身为1的状态继承上一个为雷的状态。
f[i][1]+=f[i-1][2]
为雷:继承上一个为1、为雷的状态。
f[i][2]+=f[i-1][2]+f[i-1][1]
为?:将上述所有状态全部转移。
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【成就达成】的更多相关文章
- GitHub 1W star 成就达成!
起因 感谢各位大佬的支持收获了人生第一个(很有可能也是唯一一个)1W star 项目. 从今年一月份创建项目至今 8 个月时间. 一共关闭了 27 个 issue,47 个 RP,总共有 11 位小伙 ...
- POJ 2923 Relocation(状压DP+01背包)题解
题意:给你汽车容积c1,c2,再给你n个包裹的体积,问你最少运几次能全运走 思路:用2进制表示每次运送时某物在不在此次运送之中,1在0不在.我们把运送次数抽象成物品价值,把状态抽象成体积,用一个dp[ ...
- My_Plan part1 小结
数位DP AC十道题目以上 成就达成 八月份!三个月!想想就令人兴奋呢 开始写总结啦 貌似简单的数位DP只需要改改模板就可以啦 就按照我的做题顺序开始总结吧 先是学习了一发模板:http://www. ...
- CSP-S2020AFO记
2020-10.11 考初赛辣. 选择题考了一堆时间复杂度,一个不会(卒) 我寻思这01背包哪里能用贪心? 啊,这,这,这手写快排竟如此简单,手写取Max,手写队列,两个字符串颠来倒去,竟活到爆! 震 ...
- gulp使用小结(一)
这篇文章不会介绍 gulp 的起源.发展:不会去一个个讲解 gulp API:也不想出现大段大段的 gulpfile.js 代码:更木有帮你分析 gulp 实现原理,只有一些我自己对 gulp 的使用 ...
- No.5__C#
One month 今天是个有纪念意义的日子,2015-4-23.今天是实习的第一个月,算是成就达成吧.虽然,除去了周末六日和清明什么的,只剩下20多天了,但是,还是好开心 啊,毕竟是第一次参加工作, ...
- gulp前端自动化构建工具使用
(1)新建项目目录gulp_web (2)项目目录下建目录src里面存放需要进行gulp处理的文件目录及文件 (3)gulpfile.js文件内容为声明需要打包应用的gulp组件及打包文件路径和打包任 ...
- 一篇迟到的gulp文章
前言 这篇文章本应该在去年17年写的,但因为种种原因没有写,其实主要是因为懒(捂脸).gulp出来的时间已经很早了,16年的时候还很流行,到17年就被webpack 碾压下去了,不过由于本人接触gul ...
- 游戏编程模式 Game Programming Patterns (Robert Nystrom 著)
第1篇 概述 第1章 架构,性能和游戏 (已看) 第2篇 再探设计模式 第2章 命令模式 (已看) 第3章 享元模式 (已看) 第4章 观察者模式 (已看) 第5章 原型模式 (已看) 第6章 单例模 ...
随机推荐
- C#搞跨平台UI,封装Cef作为Cpf的控件支持Windows,Linux,Mac
终于封装完成了,采用离屏渲染方式,支持JS和C#互相调用,C#方法自动绑定到JS里,中文输入有自动调整输入法位置. 基于开源的CefGlue 移植,本来想用CefSharp,不过这个里面有很多C++的 ...
- 狂神说redis笔记(一)
一.Nosql概述 1.单机Mysql时代 90年代,一个网站的访问量一般不会太大,单个数据库完全够用.随着用户增多,网站出现以下问题: 数据量增加到一定程度,单机数据库就放不下了 数据的索引(B+ ...
- 聚类算法K-Means算法和Mean Shift算法介绍及实现
Question:什么是聚类算法 1.聚类算法是一种非监督学习算法 2.聚类是在没有给定划分类别的情况下,根据数据相似度进行样本分组的一种方法 3.理论上,相同的组的数据之间有相同的属性或者是特征,不 ...
- 「模拟8.29」chinese(性质)·physics·chemistry(概率期望)
T1 chinese 根据他的问题i*f[i]我们容易联想到,答案其实是每种方案中每个点的贡献为1的加和 我们可以转变问题,每个点在所有方案的贡献 进而其实询问就是1-k的取值,有多少中方案再取个和 ...
- 【dp】背包问题
01背包 呐,为什么叫它01背包呢,因为装进去就是1,不装进去就是0.所以针对每个物品就两种状态,装,不装(请允许我用这么老套的开篇,相信听过很多次背包讲解的人,大多都是这个开篇的)所以咯,我这个背包 ...
- 『心善渊』Selenium3.0基础 — 6、Selenium中使用XPath定位元素
目录 1.Selenium中使用XPath查找元素 (1)XPath通过id,name,class属性定位 (2)XPath通过标签中的其他属性定位 (3)XPath层级定位 (4)XPath索引定位 ...
- 注解式项目开发!详细解析Java中各个注解的作用和使用方式
@Target 作用: 指明了修饰的这个注解的使用范围, 即被描述的注解可以用在哪里 @Target(ElementType.Type) ElementType取值的类型: TYPE: 类,接口或者枚 ...
- 20201123 《python程序设计》实验四报告
20201123 2020-2021-2 <python程序设计>实验三报告 课程:<Python程序设计>班级:2011姓名:晏鹏捷学号:20201123实验教师:王志强实验 ...
- Linux-Samba服务
Samba服务 1.Samba的起源 对于windows的网上邻居来讲,共享文件的方式用的是SMB和CIFS协议以及NETBIOS协议Linux/Unix之间用的是NFS协议. 但是Linux和Win ...
- GDI+中发生一般性错误的解决办法(转载)
今天在开发.net引用程序中,需要System.Drawing.Image.Save 创建图片,debug的时候程序一切正常,可是发布到IIS后缺提示出现"GDI+中发生一般性错误" ...