Description

在$[L, R]$找出有几个数满足两个条件 :

1 : 不同时含有$4$ 和 $8$

2 : 至少有$3$个相邻的数相同

Solution

非常容易的数位DP,

$pos$ 为当前第几位, $ex$ 表示是否出现过$4$ 或 $8$, $pre$表示 前面的是几, $num$表示有几个相邻的数相同。

答案就是 $sum[pos][ex][pre][num] $了QuQ。 $DP$ 和 模板一样。

还需要注意如果$L = 1e10$ , 查$L - 1$ 时必须返回$0$

Code

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define ll long long
using namespace std; int a[];
ll sum[][][][]; ll dfs(int pos, int ex, int pre, int num, bool lim, bool lead) {
if(!pos)
return num >= ;
if(!lim && !lead && sum[pos][ex][pre][num] != -)
return sum[pos][ex][pre][num];
int up = lim ? a[pos] : ;
ll tmp = ;
for(int i = ; i <= up; ++i) {
if(lead && i == ) continue;
if(ex == && i == ) continue;
if(ex == && i == ) continue;
int nx;
if(i == ) nx = ;
else if(i == ) nx = ;
else nx = ex;
if(pre == i && num < )
tmp += dfs(pos - , nx, i, num + , lim && a[pos] == i, false);
else if(num >= )
tmp += dfs(pos - , nx, pre, num, lim && a[pos] == i, false);
else tmp += dfs(pos - , nx, i, , lim && a[pos] == i, false);
}
if(!lim && !lead) sum[pos][ex][pre][num] = tmp;
return tmp;
} ll work(ll x) {
if(x < (ll)1e10)
return ;
int len = ;
while(x) {
a[++len] = x % ;
x /= ;
}
return dfs(, , , , true, true);
} int main()
{
ll l, r;
scanf("%lld%lld", &l, &r);
memset(sum, -, sizeof(sum));
printf("%lld\n", work(r) - work(l - ));
}

BZOJ 4521 [CQOI2016]手机号码 - 数位DP的更多相关文章

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

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

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

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

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

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

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

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

  5. [Luogu P4124] [CQOI2016]手机号码 (数位DP)

    题面 传送门:洛咕 Solution 感谢神仙@lizbaka的教学 这题是数位DP的非常非常模板的题目,只是状态有点多 . 这题我使用记忆化搜索实现的 中国有句古话说的好,有多少个要求就设多少个状态 ...

  6. bzoj 4521: [Cqoi2016]手机号码

    感觉get到了一种数位dp的新姿势,加一位表示当前要填的数有没有限制(感觉以前的写法都太蠢了). 这么写有两个地方要注意: 1.每dp到一位时需要f[i][初始状态]++,相当于这位前都是前导零(这道 ...

  7. [bzoj4521][Cqoi2016][手机号码] (数位dp+记忆化搜索)

    Description 人们选择手机号码时都希望号码好记.吉利.比如号码中含有几位相邻的相同数字.不含谐音不 吉利的数字等.手机运营商在发行新号码时也会考虑这些因素,从号段中选取含有某些特征的号 码单 ...

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

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

  9. 【BZOJ-4521】手机号码 数位DP

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

随机推荐

  1. Matlab练习——rpy2tr函数与自己实现的ZYX欧拉角的结果不同的问题

    问题背景:在根据<机器人导论>这本书的Z-Y-X欧拉角原理用Matlab实现旋转矩阵求解时,发现与直接调用机器人工具箱中的rpy2tr()函数得出的结果并不相同. 首先:先检查自己写的函数 ...

  2. @JsonInclude注解,RestTemplate传输值为null的属性,利用FastJson将属性中有空值null的对象转化成Json字符串

    一个pojo类: import lombok.Data; @Data public class Friend { private String name; private int age; priva ...

  3. NTKO OFFICE文档控件

    目录 前言 什么是ntko 准备工作 实战演练 总结 一.前言 Web开发中经常需要用到在线处理office文档的功能,现在市面上有一些常用的Web页面调用显示Office的控件技术,用起来很方便. ...

  4. mysql 拼接字符

    Mysql的查询结果行字段拼接,可以用下面两个函数实现: 1. concat函数 mysql> select concat('1','2','3') from test ; +--------- ...

  5. yii 缓存的使用 以及使用需要开启php的apc扩展

    public function behaviors() { return [ [ 'class' => 'yii\filters\PageCache', 'only' => ['index ...

  6. iview 表单验证

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  7. hive 的理解

    什么是Hive 转自: https://blog.csdn.net/qingqing7/article/details/79102691 1.Hive简介 Hive 是建立在 Hadoop 上的数据仓 ...

  8. MAT eclipse内存分析工具

      启动的时候提示: Failed to load the JNIshared library 解决办法: 查看配置文件:MemoryAnalyzer.ini --launcher.librarypl ...

  9. 安装Eclipse Maven插件的几种方法

    文章出处:http://blog.csdn.net/lfsfxy9/article/details/9397937 感谢作者的分享! 昨天直接在机器上配置了Maven环境,今天顺便把Eclipse等I ...

  10. thymeleaf 在js中获取message信息或获取后台属性

    <script th:inline="javascript"> /*<![CDATA[*/ [[#{message1}]] [[${abc}]] /*]]> ...