感觉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. python将response中的cookies加入到header

    url = “http://abad.com”header = { "user-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64 ...

  2. 读取classpath配置文件的方法

    http://www.cnblogs.com/sprinng/p/5622600.html

  3. Daily Scrum5 11.7

    今日任务: 姓名 任务 时长 徐钧鸿 学习了java连接sqlserver的方法并且实现了连接池 2h 张艺 继续完成和用户管理有关的类的移植(Register.Success.Validate等) ...

  4. 20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结

    20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: http://www.cnblogs.com/ ...

  5. 20162319 实验二 Java面对对象程序设计 实验报告

    实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验 ...

  6. iOS开发学习-类似微信聊天消息中的电话号码点击保存到通讯录中的功能

    类似微信聊天消息中的电话号码点击保存到通讯录中的功能,ABAddress的实现在iOS9中是不能正常使用的,点击完成后,手机会非常的卡,iOS9之后需要使用Contact新提供的方法来实现该功能.快捷 ...

  7. 软工1816 · 作业(十二)Beta答辩总结

    组长博客 宣传视频 github团队项目仓库 本组成员 队员姓名与学号 124 王彬(组长) 206 赵畅 215 胡展瑞 320 李恒达 131 佘岳昕 431 王源 206 陈文垚 209 陈志炜 ...

  8. beta冲刺(5/7)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:恺琳 组员6:翟丹丹 组员7:何家伟 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4 ...

  9. 四则运算web版

    1)在文章开头给出Coding.Net项目地址.(1') https://git.coding.net/meiyoupiqidefan/jieduizuoye.git url测试地址:http://3 ...

  10. mac上查找nginx安装位置

    在终端输入: nginx -V 查看nginx版本及安装的本地位置 ngxin -v 查看nginx版本(此方法依然可以检测是否安装某一软件,如git,hg等)