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. phpstorm 习惯设置

    phpstorm 习惯设置 1. 字体:Source Code Pro 大小:14 链接: https://pan.baidu.com/s/1HLpbduBHFvbq1a10QV4uCg 提取码: y ...

  2. nginx 设置静态下载界面

    首先,官方设置链接:https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/ 下面贴一个配置文件: cha ...

  3. Django drf:cbv源码、resful规范及接口、drf使用、response源码、序列化

    一.cbv源码分析 二.resful规范 三.django中写resful的借口 四.drf写resful的借口 五.APIVIew源码分析 六.drf之序列化 一.cbv源码分析 -CBV和FBV ...

  4. EasyUI中取的DataGrid中选中行数据

    dataGrid中显示列:ItemID,ItemCode,ItemName,Note 一.选中一行 var selRow = $('#dataGrid').datagrid('getSelected' ...

  5. 图像处理---《在图片上打印文字 putText()》

    图像处理---<在图片上打印文字 putText()> 目的:想在处理之后的图像上打印输出结果. 方法: (1)只在图像上打印 数字.字母的话:                 1.Mat ...

  6. Hdu 4661 树上拓扑序计数

    #include <bits/stdc++.h> using namespace std; typedef long long ll; ; ; ; ], nxt[MAXM << ...

  7. C# 接口的作用浅谈举例(转)

    转:http://blog.csdn.net/liuqinghui1990/article/details/77171051 我初次接触接口(Interface),对接口的作用有点迷茫,C#接口中包含 ...

  8. 4-windows启用账户锁定计数器

    1.打开本地策略编辑器 命令:gpedit.msc 2.找到账户锁定策略 3.右键属性,设置登录无效次数 注:这个策略修改完后,不需要重新服务器就能生效

  9. CodeForces 839B - Game of the Rows | Codeforces Round #428 (Div. 2)

    血崩- - /* CodeForces 839B - Game of the Rows [ 贪心,分类讨论] | Codeforces Round #428 (Div. 2) 注意 2 7 2 2 2 ...

  10. is(expr|obj|ele|fn)

    is(expr|obj|ele|fn) 概述 根据选择器.DOM元素或 jQuery 对象来检测匹配元素集合,如果其中至少有一个元素符合这个给定的表达式就返回true.大理石平台支架 如果没有元素符合 ...