P4124 [CQOI2016]手机号码
P4124 [CQOI2016]手机号码


题解
数位DP DFS 虽然套路,但还是恶心到找不到锅在哪里
注意这个

然后你就发现其实这样就不用记录前导0了
锅在这个鬼地方QAQ
代码
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<queue> using namespace std; typedef long long ll; inline ll read()
{
ll ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} ll l,r;
ll c[],len=;
ll dp[][][][][][]; ll dfs(ll pos,ll pre,ll ppre,bool have8,bool have4,bool have,bool limit,bool qdl)
//当前填到了第几位,
前一位是啥,
前前位是啥,
有没有8,
有没有4,
有没有连续相等的至少3个数,
有没有顶上界,
是不是全都是前导0
{
if(have8&&have4) return ;
if(pos<=) return have;
if(!limit&&!qdl&&dp[pos][pre][ppre][have8][have4][have]!=-)
return dp[pos][pre][ppre][have8][have4][have];
ll ans=;
ll up=limit?c[pos]:;
for(ll i=(pos==len);i<=up;i++)
//注意这里,如果是第一位就不能填0,要从1填起
ans+=dfs(pos-,i,pre,
have8||(i==),have4||(i==),
have||((i==pre)&&(i==ppre)),
limit&&(i==up),qdl&&(i==));
if(!limit&&!qdl) dp[pos][pre][ppre][have8][have4][have]=ans; return ans;
} ll sum(ll x)
{
if(x<1e10||x>=1e11) return ; memset(c,,sizeof(c));len=;
while(x)
{
c[++len]=x%;
x/=;
}
memset(dp,-,sizeof(dp)); return dfs(len,-,-,,,,,);
} int main()
{
l=read();r=read();
if(l>r) { printf("0\n"); return ; }
printf("%lld\n",sum(r)-sum(l-)); return ;
}
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<queue> using namespace std; typedef long long ll; inline ll read()
{
ll ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} ll l,r;
ll c[],len=;
ll dp[][][][][][]; ll dfs(ll pos,ll pre,ll ppre,bool have8,bool have4,bool have,bool limit)
{
if(have8&&have4) return ;
if(pos<=) return have;
if(!limit&&dp[pos][pre][ppre][have8][have4][have]!=-)
return dp[pos][pre][ppre][have8][have4][have];
ll ans=;
ll up=limit?c[pos]:;
for(ll i=(pos==len);i<=up;i++)
//注意这里,如果是第一位就不能填0,要从1填起
ans+=dfs(pos-,i,pre,
have8||(i==),have4||(i==),
have||((i==pre)&&(i==ppre)),
limit&&(i==up));
if(!limit) dp[pos][pre][ppre][have8][have4][have]=ans; return ans;
} ll sum(ll x)
{
if(x<1e10||x>=1e11) return ; memset(c,,sizeof(c));len=;
while(x)
{
c[++len]=x%;
x/=;
}
memset(dp,-,sizeof(dp)); return dfs(len,-,-,,,,);
} int main()
{
l=read();r=read();
if(l>r) { printf("0\n"); return ; }
printf("%lld\n",sum(r)-sum(l-)); return ;
}
不计前导0 (其实没有太大改变)
P4124 [CQOI2016]手机号码的更多相关文章
- [Luogu P4124] [CQOI2016]手机号码 (数位DP)
题面 传送门:洛咕 Solution 感谢神仙@lizbaka的教学 这题是数位DP的非常非常模板的题目,只是状态有点多 . 这题我使用记忆化搜索实现的 中国有句古话说的好,有多少个要求就设多少个状态 ...
- [洛谷P4124][CQOI2016]手机号码
题目大意:给你两个$l,r$,求出$[l,r]$中符合要求的数,要求为至少有$3$个相邻的相同数字,且不可以同时出现$8$和$4$ 题解:数位$DP$ 卡点:无 C++ Code: #include ...
- 洛谷 P4124 [CQOI2016]手机号码
题意简述 求l~r之间不含前导零,至少有三个相邻的相同数字,不同时含有4和8的11位正整数的个数 题解思路 数位DP,注意在l,r位数不够时补至11位 代码 #include <cstdio&g ...
- 4521: [Cqoi2016]手机号码
4521: [Cqoi2016]手机号码 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1030 Solved: 609 [Submit][Statu ...
- [BZOJ4521][CQOI2016]手机号码(数位DP)
4521: [Cqoi2016]手机号码 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 875 Solved: 507[Submit][Status ...
- [Bzoj4521][Cqoi2016]手机号码(数位dp)
4521: [Cqoi2016]手机号码 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 870 Solved: 505[Submit][Status ...
- [CQOI2016]手机号码 数位DP
[CQOI2016]手机号码 用来数位DP入门,数位DP把当前是否需要限制取数范围(是否正在贴着临界值跑,即下面的limited)和一切需要满足的条件全部塞进记忆化搜索参数里面就好了,具体情况转移便好 ...
- 【洛谷P4124】[CQOI2016]手机号码
手机号码 数位DP模板题 记忆化搜索: #include<iostream> #include<cstring> #include<cstdio> using na ...
- BZOJ4521: [Cqoi2016]手机号码
Description 人们选择手机号码时都希望号码好记.吉利.比如号码中含有几位相邻的相同数字.不含谐音不 吉利的数字等.手机运营商在发行新号码时也会考虑这些因素,从号段中选取含有某些特征的号 码单 ...
随机推荐
- Vue Elementui中的Tag与页面其它元素相互交互
参考:https://www.jb51.net/article/147917.htm 思路 一.多选框勾选,出现对应的tag: 1.利用watch监听多选框绑定的值A(数组)的变化:2.根据A的变化, ...
- WPF实战案例-MVVM模式下用附加属性在Xaml中弹出窗体
嗯..最近回家去了,2个月没写过代码了,面试只能吹牛,基础都忘了,今天回顾一下,分享一篇通过附加属性去处理窗体弹出的情况. 或许老司机已经想到了,通过设置附加属性值,值变更的回调函数去处理窗体弹出,是 ...
- 记录一次ABP下载模板的坑
1.拉取ABP官网的模板的最新代码,我的代码结构是这样的 https://aspnetboilerplate.com/Templates 环境安装的部分我就不说明了.node.js npm 等等部分 ...
- 本地套接字-本地socket
本地套接字简单应用场景 一 #服务端--简单 import socket import os a='sock_file' if os.path.exists(a): os.remove(a) s=so ...
- Mac下用命令行压缩和解压rar文件的方法(转)
废话不多说,直接进入主题 第一步:下载RAR工具包或https://www.rarlab.com/download.htm,根据自己需要下载相对应的版本 第二步:解压对应的压在的压缩包rarosx-5 ...
- 蓝桥杯BASIC-13 数列排序
问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整数n. 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000. 输 ...
- osm3ge
https://www.acugis.com/opentileserver/ https://openmaptiles.org/docs/ https://www.maptiler.com/?_ga= ...
- JavaScript中的类(Class)
基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到的,新的class写法是让对象原型的写法更加清晰,更像面向对象编程的语法而已. ES5生成例对象传统方法是通过构造函 ...
- IDEA中配置Jetty Server
首先去 Eclipse官网下载Jetty jar包 鼠标移到Jetty上时 点击 Git it (得到它) 点击 .zip等待下载完成 然后 解压出来 接下就让我们 开始 使用IDEA了(创建一个We ...
- python 中的匿名函数lamda和functools模块
为什么 要把匿名函数和functools模块写在一起? 因为 lamda函数和functools模块都是对函数一种增强或者是简化. 匿名函数: 为了解决那些功能很简单的需求而设计一次性的需求函数 #& ...