[Luogu P4124] [CQOI2016]手机号码 (数位DP)
题面
传送门:洛咕
Solution
感谢神仙@lizbaka的教学
这题是数位DP的非常非常模板的题目,只是状态有点多
.
这题我使用记忆化搜索实现的
中国有句古话说的好,有多少个要求就设多少个状态。
所以说,考虑这样设置状态:
设\(f[i][j][k][2][2][2][2][2]\)表示当前填到第i位,上一位填了j,上两位填了k,是否卡上界,上一个数是否为前导零,是否有4,是否有8,是否出现了连续三个相同的数字,之后任意填的可行方案总数
使用记忆化搜索的话,转移是非常容易的,我们只需要像写搜索一样递归写下去就好
差不多长成这样:
for(int i=0;i<=(limit==true?l[to]:9);i++)
{
if(zero==false or i!=0)
t_ans+=dfs(to+1,i,last1,limit==true and i==l[to],false,four or i==4,eight or i==8,ok==true or(last1==last2 and last2==i));
else
t_ans+=dfs(to+1,i,last1,limit==true and i==l[to],true,false,false,false);
}
注:此题不用讨论前导零,但是我为了模板的完整性,也加上了。
注意,递归算法一定要有出口,这里也不例外,出口为i==n+1(即已经填完了)
具体写法还请看代码
Code
//Luogu P4124 [CQOI2016]手机号码
//Jan,13rd,2019
//测试递归实现数位DP
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=20;
long long f[N][15][15][2][2][2][2][2];//位数,上一位,上两位,limit,zero,4,8,OK
int n,l[N];
long long dfs(int to,int last1,int last2,bool limit,bool zero,bool four,bool eight,bool ok)
{
if(f[to][last1][last2][limit][zero][four][eight][ok]>=0)
return f[to][last1][last2][limit][zero][four][eight][ok];
long long t_ans=0;
if(to==n+1)
{
if((four and eight)==false and ok==true)
t_ans=1;
return f[to][last1][last2][limit][zero][four][eight][ok]=t_ans;
}
for(int i=0;i<=(limit==true?l[to]:9);i++)
{
if(zero==false or i!=0)
t_ans+=dfs(to+1,i,last1,limit==true and i==l[to],false,four or i==4,eight or i==8,ok==true or(last1==last2 and last2==i));
else
t_ans+=dfs(to+1,i,last1,limit==true and i==l[to],true,false,false,false);
}
return f[to][last1][last2][limit][zero][four][eight][ok]=t_ans;
}
int main()
{
long long ans[3];
for(int i=1;i<=2;i++)
{
long long t_num;
scanf("%lld",&t_num);
if(i==1) t_num--;
n=0;
while(t_num!=0)
l[++n]=t_num%10,t_num/=10;
reverse(l+1,l+1+n);
memset(f,0x80,sizeof f);
dfs(1,0,0,true,true,false,false,false);
ans[i]=f[1][0][0][true][true][false][false][false];
}
printf("%lld",ans[2]-ans[1]);
return 0;
}
[Luogu P4124] [CQOI2016]手机号码 (数位DP)的更多相关文章
- [BZOJ4521][CQOI2016]手机号码(数位DP)
4521: [Cqoi2016]手机号码 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 875 Solved: 507[Submit][Status ...
- [CQOI2016]手机号码 数位DP
[CQOI2016]手机号码 用来数位DP入门,数位DP把当前是否需要限制取数范围(是否正在贴着临界值跑,即下面的limited)和一切需要满足的条件全部塞进记忆化搜索参数里面就好了,具体情况转移便好 ...
- BZOJ 4521 [CQOI2016]手机号码 - 数位DP
Description 在$[L, R]$找出有几个数满足两个条件 : 1 : 不同时含有$4$ 和 $8$ 2 : 至少有$3$个相邻的数相同 Solution 非常容易的数位DP, $pos$ 为 ...
- [bzoj4521][Cqoi2016][手机号码] (数位dp+记忆化搜索)
Description 人们选择手机号码时都希望号码好记.吉利.比如号码中含有几位相邻的相同数字.不含谐音不 吉利的数字等.手机运营商在发行新号码时也会考虑这些因素,从号段中选取含有某些特征的号 码单 ...
- bzoj 4521 [Cqoi2016]手机号码——数位dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4521 dfs真好用~ #include<iostream> #include&l ...
- P4124 [CQOI2016]手机号码
P4124 [CQOI2016]手机号码 题解 数位DP DFS 虽然套路,但还是恶心到找不到锅在哪里 注意这个 然后你就发现其实这样就不用记录前导0了 锅在这个鬼地方QAQ 代码 #inclu ...
- 【BZOJ-4521】手机号码 数位DP
4521: [Cqoi2016]手机号码 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 303 Solved: 194[Submit][Status ...
- BZOJ 4521 CQOI 2016 手机号码 数位DP
4521: [Cqoi2016]手机号码 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 539 Solved: 325[Submit][Status ...
- [洛谷P4124][CQOI2016]手机号码
题目大意:给你两个$l,r$,求出$[l,r]$中符合要求的数,要求为至少有$3$个相邻的相同数字,且不可以同时出现$8$和$4$ 题解:数位$DP$ 卡点:无 C++ Code: #include ...
随机推荐
- 使用VS2015从TFS获取项目后编译报错
把VS2015关闭后,打开C:\Windows\Temp,把里面的文件清空后,重新打开VS即可.
- web框架推导
django 引言 所有的web应用本质上就是一个socket服务端,而用户的浏览器. 软件开发架构 cs架构 bs架构 本质上,bs架构也是cs架构 http协议 网络协议 http协议 数据传输是 ...
- 日志分析平台ELK之日志收集器filebeat
前面我们了解了elk集群中的logstash的用法,使用logstash处理日志挺好的,但是有一个缺陷,就是太慢了:当然logstash慢的原因是它依赖jruby虚拟机,jruby虚拟机就是用java ...
- Redash 二开 - 后端环境搭建
Redash 二开 - 后端环境搭建 一.操作系统选择 官方文档有一句话:Windows users: while it should be possible to run Redash on a W ...
- CDH5部署三部曲之一:准备工作
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- DM9000时序设置
想了解一下DM9000的移植修改原理,所以分析了一下时序图和引脚连接 首先看一下DM9000的引脚和MINI2440的引脚连接 DM9000 MINI2440 功能描述 SD0 DA ...
- linux配置定时任务cron/定时服务与自启动
实现linux定时任务有:cron.anacron.at,使用最多的是cron任务 名词解释 cron--服务名:crond--linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与 ...
- 极简 Node.js 入门 - 5.2 url & querystring
极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...
- 99%的Android开发不得不面对的三道坎,到底该怎么破?
今年比往年要特殊一些,受疫情的影响,很多公司都出现了裁员现象.以至于最近很多技术同学也在纷纷向我倒苦水. 王鹏便是其中的一员,王鹏之前是在一线城市的一家小型互联网公司做Android应用开发.从毕业实 ...
- 程序员的“三十而已”,你都30岁了,不会还在XXX吧?
一部<三十而已>火了 太太们的包包鄙视链出圈了 有人的地方就有江湖 是的,程序员入圈是容易的 不需要4万的LV,更不需要限量版的爱马仕 只需要一件耐躁的格子衫 然而,程序员的30岁, 却说 ...