题目链接

\(Description\)

求\([l,r]\)中\(0,1,\cdots,9\)每个数字出现的次数(十进制表示)。

\(Solution\)

对每位分别DP。注意考虑前导0: 在最后统计时,把0的答案减掉对应位的即可,在第\(i\)位的前导0会产生额外的\(10^{i-1}\)个答案。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. int Ans[10],A[10],f[10][10],pw[10];
  5. bool vis[10][10];
  6. int DFS(int pos,int cnt,bool lim,int K)
  7. {
  8. if(!pos) return cnt;
  9. if(!lim && vis[pos][cnt]) return f[pos][cnt];
  10. int up=lim?A[pos]:9, res=0;
  11. for(int i=0; i<=up; ++i)
  12. res+=DFS(pos-1,cnt+(i==K),i==up&&lim,K);
  13. if(!lim) vis[pos][cnt]=1,f[pos][cnt]=res;
  14. return res;
  15. }
  16. int main()
  17. {
  18. pw[0]=1;
  19. for(int i=1; i<=8; ++i) pw[i]=pw[i-1]*10;
  20. int l,r;
  21. while(scanf("%d%d",&l,&r),l&&r)
  22. {
  23. if(l>r) std::swap(l,r);
  24. for(A[0]=0; r; r/=10) A[++A[0]]=r%10;
  25. for(int i=0; i<=9; ++i)//每个数答案都是不同的。。别忘清空。
  26. memset(vis,0,sizeof vis), Ans[i]=DFS(A[0],0,1,i);
  27. int bit=A[0];
  28. for(A[0]=0,--l; l; l/=10) A[++A[0]]=l%10;
  29. for(int i=0; i<=9; ++i)
  30. memset(vis,0,sizeof vis), Ans[i]-=DFS(A[0],0,1,i);
  31. while(bit!=A[0]) Ans[0]-=pw[--bit];
  32. for(int i=0; i<9; ++i) printf("%d ",Ans[i]);
  33. printf("%d\n",Ans[9]);
  34. }
  35. return 0;
  36. }

数字计数:

  1. //824kb 52ms
  2. //被longlong坑。。
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <algorithm>
  6. typedef long long LL;
  7. LL Ans[13],A[13],f[13][13],pw[13];
  8. bool vis[13][13];
  9. LL DFS(int pos,LL cnt,bool lim,int K)
  10. {
  11. if(!pos) return cnt;
  12. if(!lim && vis[pos][cnt]) return f[pos][cnt];
  13. int up=lim?A[pos]:9; LL res=0;
  14. for(int i=0; i<=up; ++i)
  15. res+=DFS(pos-1,cnt+(i==K),i==up&&lim,K);
  16. if(!lim) vis[pos][cnt]=1,f[pos][cnt]=res;
  17. return res;
  18. }
  19. int main()
  20. {
  21. pw[0]=1;
  22. for(int i=1; i<=12; ++i) pw[i]=pw[i-1]*10ll;
  23. LL l,r;
  24. scanf("%lld%lld",&l,&r);
  25. if(l>r) std::swap(l,r);
  26. for(A[0]=0; r; r/=10) A[++A[0]]=r%10;
  27. for(int i=0; i<=9; ++i)//每个数答案都是不同的。。别忘清空。
  28. memset(vis,0,sizeof vis), Ans[i]=DFS(A[0],0,1,i);
  29. int bit=A[0];
  30. for(A[0]=0,--l; l; l/=10) A[++A[0]]=l%10;
  31. for(int i=0; i<=9; ++i)
  32. memset(vis,0,sizeof vis), Ans[i]-=DFS(A[0],0,1,i);
  33. while(bit!=A[0]) Ans[0]-=pw[--bit];
  34. for(int i=0; i<9; ++i) printf("%lld ",Ans[i]);
  35. printf("%lld",Ans[9]);
  36. return 0;
  37. }

UVA.1640.The Counting Problem / BZOJ.1833.[ZJOI2010]数字计数(数位DP)的更多相关文章

  1. [ZJOI2010]数字计数 数位DP

    最近在写DP,今天把最近写的都放上来好了,,, 题意:给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 首先询问的是一个区间,显然是要分别求出1 ~ r ,1 ...

  2. [luogu2602 ZJOI2010] 数字计数 (数位dp)

    传送门 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output ...

  3. Luogu P2602 [ZJOI2010]数字计数 数位DP

    很久以前就...但是一直咕咕咕 思路:数位$DP$ 提交:1次 题解:见代码 #include<cstdio> #include<iostream> #include<c ...

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

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

  5. UVA 1640 The Counting Problem UVA1640 求[a,b]或者[b,a]区间内0~9在里面各个数的数位上出现的总次数。

    /** 题目:UVA 1640 The Counting Problem UVA1640 链接:https://vjudge.net/problem/UVA-1640 题意:求[a,b]或者[b,a] ...

  6. UVA 1640 The Counting Problem

    https://vjudge.net/problem/UVA-1640 题意:统计区间[l,r]中0——9的出现次数 数位DP 注意删除前导0 #include<cmath> #inclu ...

  7. 1833: [ZJOI2010]count 数字计数——数位dp

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1833 省选之前来切一道裸的数位dp.. 题意 统计[a,b]中0~9每个数字出现的次数(不算 ...

  8. bzoj1833: [ZJOI2010]count 数字计数 数位dp

    bzoj1833 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. O ...

  9. [bzoj1833][ZJOI2010]count 数字计数——数位dp

    题目: (传送门)[http://www.lydsy.com/JudgeOnline/problem.php?id=1833] 题解: 第一次接触数位dp,真的是恶心. 首先翻阅了很多很多一维dp,因 ...

随机推荐

  1. Python配置tab自动补全功能

    # cat tab.py #!/usr/bin/python # python tab file import sys import readline import rlcompleter impor ...

  2. 20155217 2016-2017-2 《Java程序设计》第5周学习总结

    20155217 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 java中所有错误都会被包装为对象,可以尝试(try)执行程序并捕捉(catch)代 ...

  3. 第10月第21天 手势识别 开屏广告 Xcode快捷键

    1.手势识别 http://yulingtianxia.com/blog/2016/12/29/Multimedia-Edit-Module-Architecture-Design/ 2.开屏广告 h ...

  4. vsftp服务器部署

    环境:CentOS 6.6 目标:个人虚机部署vsftp服务器,供测试使用. 说明:步骤已改写为脚本,直接添加用户与对应的密码列表,调用函数名即可 ########################## ...

  5. 20165230 ch02 课上测试

    题目一 1.参考附图代码,编写一个程序 "week0201学号.c",判断一下你的电脑是大端还是小端. 2.提交运行结果"学号XXXX的笔记本电脑是X端"的运行 ...

  6. MySQL的Auto-Failover功能

    今天来体验一下MySQL的Auto-Failover功能,这里用到一个工具MySQL Utilities,它的功能很强大.此工具提供如下功能:(1)管理工具 (克隆.复制.比较.差异.导出.导入)(2 ...

  7. 从Dying gasp功能看Linux的响应速度(zhuan)

    转自https://blog.csdn.net/qq_20405005/article/details/77967358 前一阵子在做dying gasp功能测试,过程中恰好测试到了Linux的响应速 ...

  8. Linux网络状态工具ss命令使用详解【转】

    ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix dom ...

  9. linux根据端口查找进程【原创】

    如转载请注明地址 1.利用lsof -i:端口号 lsof -i:端口号 [root@01 ~]# lsof -i:8097COMMAND PID USER FD TYPE DEVICE SIZE/O ...

  10. java虚拟机规范(se8)——java虚拟机结构(三)

    2.6. 栈帧 栈帧用于存储数据和部分结果,同样也用于执行动态链接,返回方法的值和分派异常. 当方法被调用的时候会创建一个新的栈帧.当一个方法调用结束时,它对应的栈帧就被销毁了,不管是正常调用结束还是 ...