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. ORACLE和SQL查询库数据量

    ORACLE根据账号查询每张表数据量: select t.table_name,t.num_rows from user_tables t ORDER BY NUM_ROWS DESC; SQL SE ...

  2. inter® management engine interface黄色感叹号解决方法

    win10今天安装电脑驱动时发现inter®  management engine interface怎么装都是黄色感叹号,所以做了下以下得测试 1.inter®  management engine ...

  3. (备忘)Linux mount(挂载命令)详解

    挂接命令(mount) 首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的. 命令格式:mount [-t vfstype] [-o option ...

  4. pyltp安装

    第一步:下载wheel文件 第二步:进入该文件的文件夹 第三步:pip install wheel文件名 注意:python的安装版本必须和pyltp的版本相同,我这版本都是pyhton3.6.之前p ...

  5. Base64编码与解码的作用

    1.便于网络传输. 2.不可见性. 3.适合在http,mime协议下快速传输数据. 4 区别于加密,Base64是可以解码的,编码是 公开的,Base 64编码,任何人都可以解码

  6. Redis入门(一)——安装

    1.下载地址,选择对应版本 https://github.com/dmajkic/redis/downloads 2.下载解压后,进入到文件夹,地址栏cmd,redis-server.exe redi ...

  7. unreal 抓mobile 管线

    把renderdoc挂到生成的exe上 用命令行 “路径\xx.uproject” scenename -game -FeatureLevelES31 -windowed -resx=1920 -re ...

  8. hbase实践之写流程

    内容提要 一.写入流程 初始化ZooKeeper Session,建立长连接,获取META Region的地址. 获取rowkey对应的Region路由信息:来自.meta. 写入region 如何快 ...

  9. windows下常用cmd命令

    CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本.文件系统版本)1. appwiz.cpl:程序和功能 2. calc:启动计算器 3. certmgr. ...

  10. 2018-2019 ICPC, NEERC J. Streets and Avenues in Berhattan(DP)

    题目链接:https://codeforc.es/contest/1070/problem/J 题意:给出一个长度为 k 的字符串,选出 n 个和 m 个不同位置的字符构成两个字符串,使得两个字符串相 ...