传送门<-洛谷版

电梯<-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]数字计数的更多相关文章

  1. 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP

    题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...

  2. P2602 [ZJOI2010]数字计数&P1239 计数器&P4999 烦人的数学作业

    P2602 [ZJOI2010]数字计数 题解 DFS 恶心的数位DP 对于这道题,我们可以一个数字一个数字的求 也就是分别统计区间 [ L , R ] 内部数字 i 出现的次数 (0<=i&l ...

  3. 【洛谷】2602: [ZJOI2010]数字计数【数位DP】

    P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入输出格式 输入格式: 输入文件中仅包含一行两个整数a ...

  4. P2602 [ZJOI2010]数字计数(递推)

    P2602 [ZJOI2010]数字计数 思路: 首先考虑含有前导0的情况,可以发现在相同的\(i\)位数中,每个数的出现次数都是相等的.所以我们可以设\(f(i)\)为\(i\)位数每个数的出现次数 ...

  5. 数位dp详解&&LG P2602 [ZJOI2010]数字计数

    数位dp,适用于解决一类求x~y之间有多少个符合要求的数或者其他. 例题 题目描述 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除 ...

  6. UVA.1640.The Counting Problem / BZOJ.1833.[ZJOI2010]数字计数(数位DP)

    题目链接 \(Description\) 求\([l,r]\)中\(0,1,\cdots,9\)每个数字出现的次数(十进制表示). \(Solution\) 对每位分别DP.注意考虑前导0: 在最后统 ...

  7. 洛谷P2602 [ZJOI2010]数字计数(数位dp)

    数字计数 题目传送门 解题思路 用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数. 则转移方程式为:\(dp[i][j][k] += \sum_{t ...

  8. 洛谷P2602 [ZJOI2010]数字计数 题解

    题目描述 输入格式 输出格式 输入输出样例 输入样例 1 99 输出样例 9 20 20 20 20 20 20 20 20 20 说明/提示 数据规模与约定 分析 很裸的一道数位DP的板子 定义f[ ...

  9. BZOJ1833:[ZJOI2010]数字计数——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1833 https://www.luogu.org/problemnew/show/P2602 给定两 ...

随机推荐

  1. docker 初始化执行.sh修改.properties文件

    1.testmysql.properties rootuser=aarootpass=bb 2.用环境变量修改testmysql.properties里面的rootuser和rootpass的值的脚本 ...

  2. Tomcat的windows10集群搭建(一台电脑同时运行多个tomcat配置方法)

    配置方法(好久不配置了,忘记了,今天还是总结下吧): 1.官网下载tomcat ,我下载了tomcat6.0和tomcat7.0(以便区分) 官网地址:http://tomcat.apache.org ...

  3. 用word2016 写CSDN 博客

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  4. 使用python登录CNZZ访问量统计网站,然后获取相应的数据

    思路: 第一步:使用pypeteer.launcher打开浏览器, 第二步:向CNZZ的登录(通过使用iframe嵌入的阿里巴巴单点登录页面),向iframe页面中自动输入用户名和密码,然后点击登录按 ...

  5. 今天踩过的坑——structs和mysql

    1 在action中写了interceptor-ref就不会用defaultStack啦.得自己补上2 继承CookiesAware是不够的,得在action中配置一下 <interceptor ...

  6. SQL SERVER 查找锁信息

    通过系统的存储过程  sp_who 或 sp_who2 可以查找出所有的锁信息, 但是看不出是哪个表, 什么语句 当使用 sp_who 或 sp_who2 查找锁信息的时候, 有个 spid 信息,  ...

  7. 10-11Linux用户管理规则及用户管理函数

    用户管理: useradd, userdel, usermod, passwd, chsh, chfn, finger, id, chage 组管理: groupadd, groupdel, grou ...

  8. Kindeditor编辑器上传附件,自动获取文件名显示。

    大部分在线编辑器在上传附件之后都是会以路径的形式显示出来很不友好.类似这样..怎么样显示成这样用户上传的原始文件名呢.就是这样.是不是看着很友好. kindeditor编辑器上传文件是已插件的形式调用 ...

  9. WebApi Post string 参数 为空

    用webApi做开发也有很久了 一些 细节平时可能未必很留心 今天就很奇葩 post 只接受一个string 参数的数据 但接收是一直未空 很奇怪 看了一些资料后得出以下结论

  10. UWP开发入门(五)——自定义Panel

    各位好,终于讲到自定义Panel了.当系统自带的几个Panel比如Gird,StackPanel,RelativePanel不能满足我们的特定要求时(其实不常见啦),自定义Panel就显得非常必要,而 ...