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章 单例模 ...
随机推荐
- Java IO学习笔记一:为什么带Buffer的比不带Buffer的快
作者:Grey 原文地址:Java IO学习笔记一:为什么带Buffer的比不带Buffer的快 Java中为什么BufferedReader,BufferedWriter要比FileReader 和 ...
- Spring Cloud06: Ribbon 负载均衡
一.使用背景 前面的学习中,我们已经使用RestTemplate来实现了服务消费者对服务提供者的调用,如果在某个具体的业务场景下,对某个服务的调用量突然大幅提升,这个时候就需要对该服务实现负载均衡以满 ...
- mybatis学习——映射器(mappers)
在定义 SQL 映射语句之前,我们需要告诉 MyBatis 到哪里去找到这些语句. 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射 ...
- Java基础面试题(史上最全、持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- Vim一直学不会?试试这个 "真香" 神器
Vim 的使用,一直以来是一个难题 以至于国外的知名程序员问答社区 StackOverFlow 上有一个问题 How to I exit the Vim editor 获得了超过 200万次的浏览量 ...
- noip模拟6[辣鸡·模板·大佬·宝藏]
这怕不是学长出的题吧 这题就很迷 这第一题吧,正解竟然是O(n2)的,我这是快气死了,考场上一直觉得aaaaa n2过不了过不了, 我就去枚举边了,然后调了两个小时,愣是没调出来,然后交了个暴力,就走 ...
- top命令信息详解
top详解 [root@localhost ~]# top top - 09:36:38 up 17:59, 3 users, load average: 0.00, 0.03, 0.00 Tasks ...
- Scala语言笔记 - 第二篇
目录 1 Map的基础操作 2 Map生成view和transform解析 最近研究了下scala语言,这个语言最强大的就是它强大的函数式编程(Function Programming)能力,记录 ...
- SpringCloud(6)Eureka架构与CAP原则与取舍策略
一:Eureka架构 Register(服务注册):把自己的 IP 和端口注册给 Eureka. Renew(服务续约):发送心跳包,每 30 秒发送一次,告诉 Eureka 自己还活着.如果 90 ...
- Linux网络命令与脚本使用
作为系统管理员,经常需要诊断和解决网络问题,而配置.监控与保护网络有助于发现问题并在事情范围扩大前得意解决,并且网络的性能与安全也是管理与诊断网络的重要部分.这里总结一下常用与Linux网络管理的命令 ...