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]手机号码的更多相关文章

  1. [Luogu P4124] [CQOI2016]手机号码 (数位DP)

    题面 传送门:洛咕 Solution 感谢神仙@lizbaka的教学 这题是数位DP的非常非常模板的题目,只是状态有点多 . 这题我使用记忆化搜索实现的 中国有句古话说的好,有多少个要求就设多少个状态 ...

  2. [洛谷P4124][CQOI2016]手机号码

    题目大意:给你两个$l,r$,求出$[l,r]$中符合要求的数,要求为至少有$3$个相邻的相同数字,且不可以同时出现$8$和$4$ 题解:数位$DP$ 卡点:无 C++ Code: #include ...

  3. 洛谷 P4124 [CQOI2016]手机号码

    题意简述 求l~r之间不含前导零,至少有三个相邻的相同数字,不同时含有4和8的11位正整数的个数 题解思路 数位DP,注意在l,r位数不够时补至11位 代码 #include <cstdio&g ...

  4. 4521: [Cqoi2016]手机号码

    4521: [Cqoi2016]手机号码 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1030 Solved: 609 [Submit][Statu ...

  5. [BZOJ4521][CQOI2016]手机号码(数位DP)

    4521: [Cqoi2016]手机号码 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 875  Solved: 507[Submit][Status ...

  6. [Bzoj4521][Cqoi2016]手机号码(数位dp)

    4521: [Cqoi2016]手机号码 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 870  Solved: 505[Submit][Status ...

  7. [CQOI2016]手机号码 数位DP

    [CQOI2016]手机号码 用来数位DP入门,数位DP把当前是否需要限制取数范围(是否正在贴着临界值跑,即下面的limited)和一切需要满足的条件全部塞进记忆化搜索参数里面就好了,具体情况转移便好 ...

  8. 【洛谷P4124】[CQOI2016]手机号码

    手机号码 数位DP模板题 记忆化搜索: #include<iostream> #include<cstring> #include<cstdio> using na ...

  9. BZOJ4521: [Cqoi2016]手机号码

    Description 人们选择手机号码时都希望号码好记.吉利.比如号码中含有几位相邻的相同数字.不含谐音不 吉利的数字等.手机运营商在发行新号码时也会考虑这些因素,从号段中选取含有某些特征的号 码单 ...

随机推荐

  1. NSInvocation简单总结

    (1)用法 NSInvocation是调用函数的另一种方式,它将调用者,函数名,参数封装到一个对象,然后通过一个invoke函数来执行被调用的函数,其思想就是命令者模式,将请求封装成对象. 例如,有这 ...

  2. 使用nodejs对Marketing Cloud的contact主数据进行修改操作

    假设在Marketing Cloud有这样一个contact主数据: 现在需求是使用编程语言比如nodejs修改这个contact实例的高亮属性. 代码如下: var config = require ...

  3. Java并发编程之线程池及示例

    1.Executor 线程池顶级接口.定义方法,void execute(Runnable).方法是用于处理任务的一个服务方法.调用者提供Runnable 接口的实现,线程池通过线程执行这个 Runn ...

  4. 文件的空间使用和IO统计

    数据库占用的存储空间,从高层次来看,可以查看数据库文件(数据文件,日志文件)占用的存储空间,从较细的粒度上来看,分为数据表,索引,分区占用的存储空间.监控数据库对象占用的硬盘空间,包括已分配,未分配, ...

  5. HTML5学习:缩略图

    HTML代码 <div> <img src="img/pic.png" alt="This is a pic" /> </div& ...

  6. jenkins 持续集成笔记1 --- 安装配置

    jenkins 安装 先安装Tomcat,然后下载jenkins war包,启动Tomcat即可 wget https://mirrors.huaweicloud.com/apache/tomcat/ ...

  7. YOLO---Darknet下的学习笔记 V190319

    YOLO---Darknet下的学习笔记 @WP 20190319 很久没有用YOlO算法了,今天又拿过来玩玩.折腾半天,才好运行通的,随手记一下: 一是,终端下的使用.二是,python接口的使用. ...

  8. Java&Selenium自动化测试实现页面元素、页面对象及测试代码分离

    一.摘要 本篇博文将介绍自动化测试实现页面元素.页面对象及测试代码分离在自动化框架中的实现 二.解析页面元素定位信息 首先,将页面元素与实际的代码分离,首先我们将页面元素定位信息和定位表达式保存在属性 ...

  9. Python&Selenium 数据驱动【unittest+ddt】

    一.摘要 本博文将介绍Python和Selenium做自动化测试的时候,基于unittest框架,借助ddt实现数据驱动 二.测试代码 # encoding = utf-8 ""& ...

  10. hdu4786 Fibonacci Tree[最小生成树]【结论题】

    一道结论题:如果最小生成树和最大生成树之间存在fib数,成立.不存在或者不连通则不成立.由于是01图,所以这个区间内的任何生成树都存在. 证明:数学归纳?如果一棵树没有办法再用非树边0边替代1边了,那 ...