题解 [ZJOI2010]数字计数
传送门<-洛谷版
电梯<-bzoj版
这份代码是新手友好版,也算是自用版,注释自认为写的很详细。
希望对要学数位dp的人有所帮助
这份题解是记忆化搜索版的数位DP,个人还是比较建议用这种方式写,比较像一种模板了
要说的一切都在代码中
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
/*
这是一个前置
FIRST
数位dp,每一次寻找都不可以超过原本给的数的大小
即621,找到第二位时,搜到1or2可以,但搜到3就要剪枝
在这份题解中用num[]代替
num[i]代表原数字中第i位中的数位num[i],就是当你在记忆化搜索时达到的边界条件
SECOND
关于前导零,当你找一个三位数时,系统认定后续所有都是三位数,即当你找
二位数会变成 0** ,即在你实际应该找到的数前有了一个零即前导零
但是前导零你是不需要的,故,你应该在记忆化搜索时舍去
*/
long long l,r,ans,sum;
/*
这是一个具体的分析
first,
我们可以用数位dp的方式找到1~(L-1)和1~R的每个字符的出现次数
相减既可以得到L~R间每个数码的出现次数
second,
要是每个数码都要以类似于离线的方法做的话,(自认为)空间复杂度就会boom
所以要一边搜一边输出
*/
][][][];
/*
第一维,代表我们dp到的数字的第几位
第二维,代表现在找到的数位上的数是否与num[]一样,小于则安全,继续
其中1代表不相等,0代表相等
第三维,代表这个数出现了几次(最多一个数有15位,所以开16)
第四维,代表前面是否有前导0
其中1代表有,0代表没有
f[][][][]代表我们找到第i位,是否合法的数码的出现次数
*/
];
//建议从主程序->函数chuli()->函数dfs()看
long long dfs(int pos,bool same,int sum,bool zero,int d){
/*
pos代表你搜到第几位,same代表他是否到极限,sum代表d出现几次
zero代表他是否有前导零,d代表你要查那个数码
*/
;
//ret代表 d 在整个区间里d的出现次数,通过记忆化求解
) return sum;
//如果你搜到第零位,则代表你搜完了,此时由于f[0][][][]是没有值的,所以要返回sum
) return f[pos][same][sum][zero];
//如果你搜到的这个状态他不是初始化的-1,则代表你搜过了,就要返回这个状态代表的值
//也是一个记忆化的过程
;i<=;i++){
//从零开始,看数码的出现次数
if(!same&&i>num[pos]) break;
//如果他本来就到极限,且你找的这个数也到极限,就要断开搜索
ret+=dfs(pos-,same||(i<num[pos]),sum+((!zero||i)&&(i==d)),zero&&(i==),d);
//如果成立,则搜另一个状态
/*
搜前一位
same的转移变为——上一个状态是否数码与极限一致,你要再搜的数码是否与极限一致
num的转移变为——上一个状态是否为(前导零,这一位是不是0),以及
你要找的是否是你这次所需要的,如果都满足,则代表你咋次查询是对的
zero的转移变为——之前是否是前导零以及这一次是否也为零
d也就还是d
*/
}
f[pos][same][sum][zero]=ret;
//当你0~9都查完时,最终状态就是ret
return ret;
}
long long chuli(long long x,int d){
//这个函数是用来拆分数位上的代码以及求原始数的长度的
;
,x/=;
memset(f,-,sizeof(f));
,,,d);
//在这里,我们选择从最高位开始搜索
}
int main(){
scanf("%lld%lld",&l,&r);//读入
;i<=;i++){
//依次寻找0~9的数码出现次数
) cout<<chuli(r,i)-chuli(l-,i)<<" ";
,i);
}
;// That's all.Thankyou for your attention.
}
如有不同意见和要提的建议,欢迎来留言,回复偶有时差,希望谅解
题解 [ZJOI2010]数字计数的更多相关文章
- 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP
题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...
- P2602 [ZJOI2010]数字计数&P1239 计数器&P4999 烦人的数学作业
P2602 [ZJOI2010]数字计数 题解 DFS 恶心的数位DP 对于这道题,我们可以一个数字一个数字的求 也就是分别统计区间 [ L , R ] 内部数字 i 出现的次数 (0<=i&l ...
- 【洛谷】2602: [ZJOI2010]数字计数【数位DP】
P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入输出格式 输入格式: 输入文件中仅包含一行两个整数a ...
- P2602 [ZJOI2010]数字计数(递推)
P2602 [ZJOI2010]数字计数 思路: 首先考虑含有前导0的情况,可以发现在相同的\(i\)位数中,每个数的出现次数都是相等的.所以我们可以设\(f(i)\)为\(i\)位数每个数的出现次数 ...
- 数位dp详解&&LG P2602 [ZJOI2010]数字计数
数位dp,适用于解决一类求x~y之间有多少个符合要求的数或者其他. 例题 题目描述 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除 ...
- UVA.1640.The Counting Problem / BZOJ.1833.[ZJOI2010]数字计数(数位DP)
题目链接 \(Description\) 求\([l,r]\)中\(0,1,\cdots,9\)每个数字出现的次数(十进制表示). \(Solution\) 对每位分别DP.注意考虑前导0: 在最后统 ...
- 洛谷P2602 [ZJOI2010]数字计数(数位dp)
数字计数 题目传送门 解题思路 用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数. 则转移方程式为:\(dp[i][j][k] += \sum_{t ...
- 洛谷P2602 [ZJOI2010]数字计数 题解
题目描述 输入格式 输出格式 输入输出样例 输入样例 1 99 输出样例 9 20 20 20 20 20 20 20 20 20 说明/提示 数据规模与约定 分析 很裸的一道数位DP的板子 定义f[ ...
- BZOJ1833:[ZJOI2010]数字计数——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1833 https://www.luogu.org/problemnew/show/P2602 给定两 ...
随机推荐
- Java 设计模式系列(八)装饰者模式
Java 设计模式系列(八)装饰者模式 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案.Decorator 或 Wrapper 一.装饰模 ...
- Java程序设计11——GUI设计与事件处理A
1.GUI设计 Java使用AWT和Swing类完成图形用户界面编程,AWT全称是Abstract Window Toolkit,即抽象窗口工具集,它是Sun最早提供的GUI库,只是这个库功能比较有限 ...
- 分布式java应用基础与实践
始读于2014年4月30日,完成于2014年6月6日15:43:39. 阿里巴巴高级研究员林昊早年的书了,这些理论放到今天估计工作一两年的人都耳熟能详了,我个人很早以前就知道此书一直没有找到资源, ...
- [原创]分享本人自己PY写的BOOST编译程序(源码)
本程序WINDOWS专用,只做抛砖引玉,希望诸位按照各自需求自行修改,主要目的是为了让诸位编译时可以省一些组合指令的时间,只需要修改几个参数即可自动编译. 支持64位编译模式. 改进版本:http:/ ...
- Redis持久化(八)
Redis特性: (1)多数据库 (2)Redis事物 (3)一个Redis最多可提供16个数据库,下标[0-15] 选择数据库: select 1 (选择1号数据库,默认连接的是0号数据库)移动数据 ...
- python使用git进行版本控制2
对上一次的readme文件进行修改 现在,运行git status命令看看结果 $ git statusOn branch masterChanges not staged for commit: ...
- Shell编程-03-Shell中的特殊变量和扩展变量
目录 特殊变量 变量扩展 特殊变量 在Shell中的特殊变量主要分别两种位置参数变量.状态变量两种. 位置参数变量 Shell中的位置参数变量主要是指$0.$1.$#等,主要用于从命令 ...
- 启动hive命令时指定参数或自定义参数
启动hive命令时指定参数或自定义参数 在hive启动命令中指定一个参数 hive --hiveconf hive.job.submit.username=fuxin.zhao -e "se ...
- .Net core 2.0的数据初始化
在StartUp.cs里面,添加Seed方法 public static void Seed(IApplicationBuilder applicationBuilder) { using (var ...
- Cookie客户端缓存.Session.Application
Cookie客户端缓存. 1.引言 随着浏览器的处理能力不断增强,越来越多的网站开始考虑将数据存储在「客户端」,那么久不得不谈本地存储了. 本地存储的好处: 一是避免取回数据前页面一片空白,如果不需要 ...