【BZOJ-4521】手机号码 数位DP
4521: [Cqoi2016]手机号码
Time Limit: 10 Sec Memory Limit: 512 MB
Submit:
303 Solved: 194
[Submit][Status][Discuss]
Description
Input
Output
输出文件内容只有一行,为1个整数,表示满足条件的手机号数量。
Sample Input
Sample Output
样例解释
满足条件的号码: 12121285000、
12121285111、 12121285222、 12121285333、 12121285550
HINT
Source
Solution
这种数据范围,一眼数位DP,但是不是特别的好搞...
F[i][j][0/1][0/1][0/1][0/1][0/1]表示位数为i,最高位为j,最高位连续两个是否是相同的,是否有连续3个相同的,是否有4,是否有8,前缀和原数前缀的大小关系
枚举这些东西....k1,k2,k3,k4,k5分别表示对应上述0/1
注意&启发:
1.数位DP一般采取预处理,后求和,这里数据范围直接处理非常方便,采用直接处理
2.注意范围$L<=10^{10}$默认10位做的话,不能直接计算Calc(R)-Calc(L-1),这里可以采取讨论,或者处理区间为开区间,计算Calc(R+1)-Calc(L)即可
3.注意状态的枚举,一些零碎的判断需要理清,否则会陷入泥潭(WA了无数,不知所措)
4.如果digit[]正序做更方便可以考虑正序处理,外加此题可以采取特殊的枚举方式
5.更深层次的了解了数位DP,但仍需更多的练习,总体来说,此题是个不错的题目,自己能想到的只是框架,实现仍有些差池
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long F[][][][][][][],l,r;
int p[],num;
long long cal(long long x)
{
memset(F,,sizeof(F));
long long ans=; int len=,digit[],a,b,c,d,e;
while(x){digit[++len]=x%; x/=;}
reverse(digit+,digit+len+);
F[][][][][][][]=;
for (int i=; i<=len-; i++)
for (int j=; j<=; j++)
for (int k1=; k1<=; k1++)
for (int k2=; k2<=; k2++)
for (int k3=; k3<=; k3++)
for (int k4=; k4<=; k4++)
for (int k5=; k5<=; k5++)
if (F[i][j][k1][k2][k3][k4])
for (int k=; k<=; k++)
{
if (k5 && (k>digit[i+])) continue;
if (k==j) a=; else a=;
if (k2==) b=(k1+a)==; else b=k2;
if (k3==) c=(k==); else c=k3;
if (k4==) d=(k==); else d=k4;
if ((c+d)==) continue;
if (k5 && (k==digit[i+])) e=; else e=;
F[i+][k][a][b][c][d][e]+=F[i][j][k1][k2][k3][k4][k5];
}
for (int i=; i<=; i++)
for (int k1=; k1<=; k1++)
for (int k3=; k3<=; k3++)
for (int k4=; (k4<=)&&(k4+k3<); k4++)
ans+=F[len][i][k1][][k3][k4][];
return ans;
}
int main()
{
scanf("%lld%lld",&l,&r);
printf("%lld\n",cal(r+)-cal(l));
return ;
}
昨晚写了道数(S)位(W)DP,结果第二天期中数学(S)物理(W)血崩...虽然1个多月的课,就上了1/4不到...但心里不爽啊o_O
【BZOJ-4521】手机号码 数位DP的更多相关文章
- BZOJ 4521 CQOI 2016 手机号码 数位DP
4521: [Cqoi2016]手机号码 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 539 Solved: 325[Submit][Status ...
- bzoj 4521 [ Cqoi 2016 ] 手机号码 —— 数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4521 数位DP,记录好多维状态: 写了半天,复杂得写不下去了,于是参考一下TJ... 练习简 ...
- BZOJ 4521 [CQOI2016]手机号码 - 数位DP
Description 在$[L, R]$找出有几个数满足两个条件 : 1 : 不同时含有$4$ 和 $8$ 2 : 至少有$3$个相邻的数相同 Solution 非常容易的数位DP, $pos$ 为 ...
- [BZOJ4521][CQOI2016]手机号码(数位DP)
4521: [Cqoi2016]手机号码 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 875 Solved: 507[Submit][Status ...
- [CQOI2016]手机号码 数位DP
[CQOI2016]手机号码 用来数位DP入门,数位DP把当前是否需要限制取数范围(是否正在贴着临界值跑,即下面的limited)和一切需要满足的条件全部塞进记忆化搜索参数里面就好了,具体情况转移便好 ...
- [Luogu P4124] [CQOI2016]手机号码 (数位DP)
题面 传送门:洛咕 Solution 感谢神仙@lizbaka的教学 这题是数位DP的非常非常模板的题目,只是状态有点多 . 这题我使用记忆化搜索实现的 中国有句古话说的好,有多少个要求就设多少个状态 ...
- BZOJ 4521 手机号码
SB数位dp. 我的貌似要特判9999999999的情况. #include<iostream> #include<cstdio> #include<cstring> ...
- BZOJ 3329: Xorequ [数位DP 矩阵乘法]
3329: Xorequ 题意:\(\le n \le 10^18\)和\(\le 2^n\)中满足\(x\oplus 3x = 2x\)的解的个数,第二问模1e9+7 \(x\oplus 2x = ...
- BZOJ.3329.Xorequ(数位DP)
题目链接 x^3x=2x -> x^2x=3x 因为a^b+((a&b)<<1)=a+b,x^2x=x+2x,所以x和2x的二进制表示中不存在相邻的1. (或者,因为x+2x ...
随机推荐
- asp.net core 日志
日志输出是应用程序必不可少的部分,log4net,nlog这些成熟的组件在之前的项目中被广泛使用,在asp.net core的项目中没有找到与之对应的log4net版本,nlog对core提供了很好的 ...
- SpringMVC的Controller中使用线程安全的初始化
因为SpringMVC的Controller默认是单例, 在这种情况下, Controller中使用的私有变量必须也是单例, 例如各种service, 否则会有多线程访问数据互相修改的问题. 对于需要 ...
- C10K 问题引发的技术变革
C10K 问题引发的技术变革 http://rango.swoole.com/archives/381
- QT 文件操作
QT提供了QFile类用于文件读写 QFile可以读写文本文件,也可以读写二进制文件 #include "widget.h" #include <QGridLayout> ...
- 使用mysqldump进行mysql数据库备份还原
mysqldump是mysql自带的备份还原工具,默认在安装目录的bin下 可通过cmd命令行启动,然后运行: 还原一个数据库: mysql -h 主机 -u 用户名 -p密码 数据库名 < 指 ...
- Theano2.1.7-基础知识之设置的配置和编译模式
来自:http://deeplearning.net/software/theano/tutorial/modes.html Configuration Settings and Compiling ...
- [HDOJ5442]Favorite Donut(最大表示法)
嗯……就是最小表示法改一下…… 这题就是把S串当作两个判断同构的串,然后就搞出最大的表示了 然后在反向再做一次 O(n)求最大表示,O(n)判断正反谁大
- vijos P1009清帝之惑之康熙
</pre>背景康熙是中国历史乃至世界历史中最伟大的帝王之一,清除螯拜,撤除三藩,统一台湾,平定准葛尔叛乱:与此同时,出众的他也被世界各国遣清使臣所折服.康熙是历史上少有的全人,不仅文武兼 ...
- Linux版本‘’大‘’全|形而上学
1.Oracle Linux(下载地址) 清单: (1)Oracle Linux Release 7 for x86_64 (64 Bit) 2.debian(下载地址) 清单: (1)debian- ...
- C# 反射范范的理解下
程序进行时引入程序集.动态的调用方法属性事件. Assembly类. type类.