[Bzoj4521][Cqoi2016]手机号码(数位dp)
4521: [Cqoi2016]手机号码
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 870 Solved: 505
[Submit][Status][Discuss]
Description
Input
Output
输出文件内容只有一行,为1个整数,表示满足条件的手机号数量。
Sample Input
Sample Output
样例解释
满足条件的号码: 12121285000、 12121285111、 12121285222、 12121285333、 12121285550
HINT
题解:
因为数位dp太弱了,再加上scoi喜欢考数位dp,这两天就在刷数位dp了。
然后刷到了这道神奇的题,让我们看看状态需要定义几维,f[i][p1][p2][4/8][three] 没错,五维。
表达的意思分别是第i位,第i + 1位数字是啥,第i +2位数字是啥,是否出现4 或者 8,是否之前出现过连续3个一样的。
实际上你会发现是八维,因为我把4 和 8 合在了一维,并且还要判断前导0,还有是否抵达上限。
然后4 /8 合在一起判断 降下一维。
这道题保证所有合法数为11位且第一位不为0,可以不用判断前导0,降下一维;
然后上限什么的在记搜过程中判断就好了,降下一维。
然后就剩五维了。
需要注意的是因为手机号码是11位数,但我们在L = 10^10方时,用 R - (L - 1)会发现(L-1) 变成了10位数,特判一下就好了。
神奇的八维数位dp
AC代码:
# include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
typedef long long LL;
LL f[][][][][],L,R;int len,data[];
LL dfs(int now,int p1,int p2,bool fr,bool et,bool three,bool lim)
{
if(fr && et)return ;
if(!now)return three;
if(!lim && f[now][p1][p2][fr + et * ][three] != -)return f[now][p1][p2][fr + et * ][three];
LL ret = ;int p = lim ? data[now] : ;
for(int i = now == len;i <= p;i++)
ret += dfs(now - ,i,p1,fr || i == ,et || i == ,three || (i == p1 && i == p2),lim && i == p);
if(!lim)f[now][p1][p2][fr + et * ][three] = ret;
return ret;
}
LL calc(LL k)
{
memset(f,-,sizeof f);
len = ;
while(k)
{
data[++len] = k % ;
k /= ;
}
if(len < )return 0LL;
return dfs(len,,,,,,);
}
int main()
{
scanf("%lld %lld",&L,&R);
printf("%lld",calc(R) - calc(L - ));
}
[Bzoj4521][Cqoi2016]手机号码(数位dp)的更多相关文章
- [BZOJ4521][CQOI2016]手机号码(数位DP)
4521: [Cqoi2016]手机号码 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 875 Solved: 507[Submit][Status ...
- [bzoj4521][Cqoi2016][手机号码] (数位dp+记忆化搜索)
Description 人们选择手机号码时都希望号码好记.吉利.比如号码中含有几位相邻的相同数字.不含谐音不 吉利的数字等.手机运营商在发行新号码时也会考虑这些因素,从号段中选取含有某些特征的号 码单 ...
- 【BZOJ-4521】手机号码 数位DP
4521: [Cqoi2016]手机号码 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 303 Solved: 194[Submit][Status ...
- [CQOI2016]手机号码 数位DP
[CQOI2016]手机号码 用来数位DP入门,数位DP把当前是否需要限制取数范围(是否正在贴着临界值跑,即下面的limited)和一切需要满足的条件全部塞进记忆化搜索参数里面就好了,具体情况转移便好 ...
- [Luogu P4124] [CQOI2016]手机号码 (数位DP)
题面 传送门:洛咕 Solution 感谢神仙@lizbaka的教学 这题是数位DP的非常非常模板的题目,只是状态有点多 . 这题我使用记忆化搜索实现的 中国有句古话说的好,有多少个要求就设多少个状态 ...
- BZOJ 4521 [CQOI2016]手机号码 - 数位DP
Description 在$[L, R]$找出有几个数满足两个条件 : 1 : 不同时含有$4$ 和 $8$ 2 : 至少有$3$个相邻的数相同 Solution 非常容易的数位DP, $pos$ 为 ...
- bzoj 4521 [Cqoi2016]手机号码——数位dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4521 dfs真好用~ #include<iostream> #include&l ...
- BZOJ4521 Cqoi2016 手机号码 【数位DP】
Description 人们选择手机号码时都希望号码好记.吉利.比如号码中含有几位相邻的相同数字.不含谐音不吉利的数字等.手机运营商在发行新号码时也会考虑这些因素,从号段中选取含有某些特征的号码单独出 ...
- [BZOJ4521][Cqoi2016]手机号码 (数位dp)
题目描述 人们选择手机号码时都希望号码好记.吉利.比如号码中含有几位相邻的相同数字.不含谐音不吉利的数字等.手机运营商在发行新号码时也会考虑这些因素,从号段中选取含有某些特征的号码单独出售.为了便于前 ...
随机推荐
- 解决./mysql-bin.index’ not found (Errcode: 13)
问题出现在升级php版本以后,网站无法连接数据库,phpMyAdmin无法登录: 然后尝试开启mysql,/etc/init.d/mysqld start ,提示: Starting MySQL. E ...
- Redis学习笔记(五)散列进阶
HEXISTS key_name key(检查键key是否存在) HKEYS key_name(获得散列的所有键) HVALS key_name(获得散列的所有值) HINCRBY key_name ...
- CSS3实现单行、多行文本溢出(省略号的形式出现)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- AWS Data Lake Service Stack
- JDO
JDO 编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! JDO(Java Data Object )是Java对象持久化的新的规范,也是一个用于存取某种数据仓库中的对象 ...
- hasChildNodes()方法,nodeName、nodeValue、nodeType介绍
Document对象的使用:hasChildNodes()方法,nodeName.nodeValue.nodeType的简单介绍 一.hasChildNodes() 说明: (1) 该方法 ...
- IOS学习笔记37——ViewController生命周期详解
在我之前的学习笔记中讨论过ViewController,过了这么久,对它也有了新的认识和体会,ViewController是我们在开发过程中碰到最多的朋友,今天就来好好认识一下它.ViewContro ...
- 【讲●解】KMP算法
KMP算法 我们小组负责讲这个... 术语与规定 为了待会方便,所以不得不做一些看起来很拖沓的术语,但这些规定能让我们更好地理解\(KMP\)甚至\(AC\)自动机. 字符串匹配形式化定义如下: 假设 ...
- 远程桌面mstsc关闭连接栏
在进行mstsc远程桌面连接电脑或者虚拟机的时候,总是会出现一个连接栏.虽然点左边的图钉可以自动隐藏,但是每次鼠标滑到上面的时候,还是会冒出来,这个就有点烦心了. 查了下资料,解决了这个问题. 关闭步 ...
- bzoj2402 陶陶的难题II
这个是题目描述: 题解: 啊啊啊啊啊…… 垃圾分数规划. 垃圾树链剖分. 垃圾斜率优化. 垃圾darkbzoj. 这里才是题解: 我们设那个分数的值=k,那么有 $(yi-k*xi)+(qj-k*pj ...