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. 如何查找SAP Fiori launchpad Designer的准确路径即url地址

    比如我们知道在SPRO里下面这个路径的customizing activity里打开Fiori Launchpad designer: SAP Netweaver->UI technologie ...

  2. deep_learning_学习资料

    TensorFlow的55个经典案例:https://blog.csdn.net/xzy_thu/article/details/76220654 吴恩达机器学习: 1.序列学习:https://mo ...

  3. Istio技术与实践05:如何用istio实现流量管理

    Istio是Google继Kubernetes之后的又一开源力作,主要参与的公司包括Google,IBM,Lyft等,它提供了完整的非侵入式的微服务治理解决方案,解决微服务的管理.网络连接以及安全管理 ...

  4. 拆机联想ideapad s500

    这是我第一次拆机,中间也是经历了各种艰难险阻,最后还算是成功.首先,说一下拆机得目的:很简单,为了加一个内存条:下面具体说拆机得步骤: 第一步,在网上查攻略,刚开始的时候,并没有很详细的具体到机型,只 ...

  5. 一图一知-TS之函数function

  6. centos wireshark

    root安装: yum install wireshark yum install wireshark-gnome wireshark error: There are no interfaces o ...

  7. Python数据库连接池 -组件 DBUtils

    DBUtils是Python的一个用于实现数据库连接池的模块 此连接池有两种连接模式: DBUtils提供两种外部接口: PersistentDB :提供线程专用的数据库连接,并自动管理连接. Poo ...

  8. BZOJ5093 图的价值——推式子+第二类斯特林数

    原题链接 题解 题目等价于求这个式子 \[ans=n2^{\frac{(n-1)(n-2)}{2}}\sum\limits_{i=0}^{n-1}\binom{n-1}{i}i^k\] 有这么一个式子 ...

  9. BZOJ4886 [Lydsy1705月赛]叠塔游戏[基环树]

    很妙的一道题. 由于本人过于zz,不会这道题,通过厚颜无耻翻阅题解无数终于懂了这道题,所以这里转载一位神仙的blog. 没有看懂?没事,再来一篇. 这题个人认为主要在于转化题意和建图,这两点想通了应该 ...

  10. DX12 开debuggerlayer

    https://social.technet.microsoft.com/Forums/azure/en-US/ef10f8eb-fee0-4cde-bb01-52d1db2ea347/win10-1 ...