感觉get到了一种数位dp的新姿势,加一位表示当前要填的数有没有限制(感觉以前的写法都太蠢了).

这么写有两个地方要注意:

1.每dp到一位时需要f[i][初始状态]++,相当于这位前都是前导零(这道题我把前两位填了两个10作为初始状态)。

2.因为有了1,所以初始状态后的第一位不能填0,需要特判

f[i][j][k][l][p][q][o]表示填到第几位,上上位和上位分别是什么,4,8是否出现过,三个连续的是否出现过,以及当前位是否有限制。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll pw[100];
ll f[20][11][11][2][2][2][2];
// 位数 上位 这位 4 8 出现0/1 限制0/1
ll solve(ll x)
{
pw[0]=1;
for(int i=1;i<=12;i++)pw[i]=pw[i-1]*10;
int pos;
for(int i=0;i<=12;i++)if(x>=pw[i])pos=i+1;
memset(f,0,sizeof(f));
f[0][10][10][0][0][0][1]=1;
for(int i=1;i<=pos;i++)
{
int ks=x/pw[pos-i]%10;
f[i][10][10][0][0][0][0]=1;
// 刷表
for(int j=0;j<=10;j++)
{
for(int k=0;k<=10;k++)
{
for(int l=0;l<=1;l++)
{
for(int p=0;p<=1;p++)
{
// 这位
for(int q=0;q<=9;q++)
{
if(j==10&&k==10&q==0)continue;
bool b1=0,c1=0,d1=0;
if(j==k&&j==q)b1=1;
if(q==4)c1=1;
if(q==8)d1=1;
f[i][k][q][l|c1][p|d1][1][0]+=f[i-1][j][k][l][p][1][0];
f[i][k][q][l|c1][p|d1][b1][0]+=f[i-1][j][k][l][p][0][0];
}
for(int q=0;q<=ks;q++)
{
if(j==10&&k==10&q==0)continue;
bool b1=0,c1=0,d1=0;
if(j==k&&j==q)b1=1;
if(q==4)c1=1;
if(q==8)d1=1;
if(q!=ks)
{
f[i][k][q][l|c1][p|d1][1][0]+=f[i-1][j][k][l][p][1][1];
f[i][k][q][l|c1][p|d1][b1][0]+=f[i-1][j][k][l][p][0][1];
}
else
{
f[i][k][q][l|c1][p|d1][1][1]+=f[i-1][j][k][l][p][1][1];
f[i][k][q][l|c1][p|d1][b1][1]+=f[i-1][j][k][l][p][0][1];
}
}
}
}
}
}
}
ll ans=0;
for(int i=0;i<=9;i++)for(int j=0;j<=9;j++)for(int k=0;k<=1;k++)for(int l=0;l<=1;l++)for(int s=0;s<=1;s++)
{
if(k&&l)continue;
ans+=f[pos][i][j][k][l][1][s];
}
return ans;
}
ll l,r;
int main()
{
scanf("%lld%lld",&l,&r);
printf("%lld\n",solve(r)-solve(l-1));
return 0;
}

  

bzoj 4521: [Cqoi2016]手机号码的更多相关文章

  1. bzoj 4521 [Cqoi2016]手机号码——数位dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4521 dfs真好用~ #include<iostream> #include&l ...

  2. BZOJ 4521 [CQOI2016]手机号码 - 数位DP

    Description 在$[L, R]$找出有几个数满足两个条件 : 1 : 不同时含有$4$ 和 $8$ 2 : 至少有$3$个相邻的数相同 Solution 非常容易的数位DP, $pos$ 为 ...

  3. bzoj 4521: [Cqoi2016]手机号码【数位dp】

    比较基础的数位dp,dfs的时候带上上一位,上上位,是否已经有连续3个相同位,是否有4,是否有8即可 但是要注意两点(在洛谷上一直70) 当l=1e10的时候,直接输出clc(r)即可,因为如果再减去 ...

  4. 4521: [Cqoi2016]手机号码

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

  5. BZOJ 4521 CQOI 2016 手机号码 数位DP

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

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

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

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

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

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

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

  9. P4124 [CQOI2016]手机号码

    P4124 [CQOI2016]手机号码 题解 数位DP   DFS  虽然套路,但还是恶心到找不到锅在哪里 注意这个 然后你就发现其实这样就不用记录前导0了 锅在这个鬼地方QAQ 代码 #inclu ...

随机推荐

  1. 高可用OpenStack(Queen版)集群-16.Nova集成Ceph

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  2. 琴声不等式--jensen

    (来自百度百科) 1. 凹函数,不加权 2. 凹函数,加权 3. 凸函数,不加权 4. 凸函数,加权 应用 在EM算法Q函数的推导中,用到了第二个不等式(凹函数,加权)

  3. PHP使用Sublime Text3技巧

    1 下载安装 2 安装Package Control 3 安装插件 4 快捷键 5 项目管理 6 设置代理 PHP开发时,笔者用过EditPlus3.Nodpad++.Vi.Vim和Netbeans, ...

  4. servlet基础学习总结

    Servlet的任务 1.  读取客户端发送的显示的数据,包括HTML表单和一些客户端程序的表单 2.  读取客户端发送的隐式的数据,包括cookies.媒体类型等 3.  处理数据并产生结果 4.  ...

  5. OO第三阶段作业总结

    调研:        最早的程序设计是直接采用机器语言来编写的,或者使用二进制码来表示机器能够识别和执行的指令和数据.机器语言的优点在于速度快,缺点在于写起来实在是太困难了,编程效率低,可读性差,并且 ...

  6. spring冲刺第六天

    昨天编写地图代码,完善地图界面,使其变得美观. 今天把地图界面初步完成,和其他团队成员的成果进行结合,整合人物和地图代码. 遇到的问题:在整合时遇到的问题比较多,今天没有整合成功.

  7. 猫咪记单词——NABCD模型分析

    N ——Need 需求:学习英语是一件非常重要的事.面对各种各样的考试,学习英语,最重要的就是词汇量,背单词是提高词汇量的最直接的方法,但是单纯的背单词太单调.寻找一些合适的,更易于接受的背单词学习英 ...

  8. 《大象Think in UML》阅读笔记之一

    Think in UML这一书以UML为载体,将面向对象的分析设计思想巧妙地融合在建模UML当中,通过一些实例将软件系统的开发过程中的一些知识有机地结合起来.全书共分为四篇:准备篇.基础篇.进阶篇和总 ...

  9. Android笔记-5-EditText密码和Checkbox二选一

    EditText密码:明文和密文 密文: public class MainActivity extends Activity { private EditText password = null; ...

  10. Pytorch相关内容

    ---恢复内容开始--- Pytorch中文官方文档:https://pytorch-cn.readthedocs.io/zh/latest/package_references/torch-nn P ...