http://www.lydsy.com/JudgeOnline/problem.php?id=1833

https://www.luogu.org/problemnew/show/P2602

给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。

虽说是数位dp,但是用套路写的话蛮麻烦的……于是嫖了一篇记忆化搜索:https://www.cnblogs.com/Sakits/p/6815468.html

大致解释一下dfs的变量,p为当前填到哪里,num为数码,sum为当前答案。

lead为是否为数的第末位(就是数要比上限的长度短的情况)。

limit为是否卡着数的上限(如果你卡着上限的话你在枚举数码填进去的时候就会受到限制)。

我们记忆化仅仅当lead和limit均为0才行。

#include<cstdio>
#include<iostream>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
typedef long long ll;
const int N=15;
ll f[N][10][N],a[N];
ll dfs(int p,int num,int sum,bool lead,bool limit){if(!p)return sum;if(!limit&&!lead&&f[p][num][sum]!=-1)return f[p][num][sum];int maxx=limit?a[p]:9;ll ans=0;if(!lead||p==1)ans+=dfs(p-1,num,sum+(num==0),0,limit&&!a[p]);else ans+=dfs(p-1,num,sum,1,limit&&!a[p]);for(int i=1;i<=maxx;i++)ans+=dfs(p-1,num,sum+(num==i),0,limit&&a[p]==i);if(!limit&&!lead)f[p][num][sum]=ans;return ans;
}
ll dp(ll x,int y){int len=0;while(x)a[++len]=x%10,x/=10;if(!len)return y==0?1:0;return dfs(len,y,0,1,1);
}
int main(){ll a,b;scanf("%lld%lld",&a,&b);memset(f,-1,sizeof(f));for(int i=0;i<9;i++)printf("%lld ",dp(b,i)-dp(a-1,i));printf("%lld\n",dp(b,9)-dp(a-1,9));return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8533724.html

BZOJ1833:[ZJOI2010]数字计数——题解相关推荐

  1. [ZJOI2010]数字计数

    一眼数位dp,但...调试了好久.. /*** Problem:Count* Author:Shun Yao* Time:2013.5.31* Result:Accepted* Memo:DP*/#i ...

  2. 【codevs1359】【BZOJ1833】数字计数,进击的学弟与数位DP

    传送门1 传送门2 写在前面:有关数位DP的题目都会做很久吗-- 思路: (神犇学弟遇到题目的加强版,暴力变DP) 30分直接暴力枚举拆位 100分考虑类似前缀和的做法,我们只要得到[0,a]的各位数 ...

  3. bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)

    1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义 ...

  4. 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2774  Solved: 1230 [Submit ...

  5. 1833: [ZJOI2010]count 数字计数

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2951  Solved: 1307 [Submit ...

  6. bzoj 1833: [ZJOI2010]count 数字计数(数字0-9的个数)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 3528  Solved: 1553 [Submit ...

  7. DP专练2 (大理石 + [ZJOI 2010]数字计数)

    你肯定以为DP专练会有很多题, 但是请考虑一下本仙女的DP码力,一次性能更几个题... 来吧,别害怕呀~~ 文章目录 大理石 题目 题解 代码实现 数字计数 题目 题解 代码实现 大理石 题目 林老师 ...

  8. 牛客题霸 [数组中只出现一次的数字] C++题解/答案

    牛客题霸 [数组中只出现一次的数字] C++题解/答案 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题解: 用map来记录每个数字出现几次, ...

  9. 牛客题霸 [ 旋转数组的最小数字] C++题解/答案

    牛客题霸 [ 旋转数组的最小数字] C++题解/答案 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. NOT ...

最新文章

  1. 苹果Siri团队被合并,由谷歌前高管直接领导
  2. Web应用架构-Nginx
  3. Advanced Sci | 打破生成式深度学习限制:低量数据下的“one-shot”药设计法
  4. android调试神器Stetho
  5. Orac and Game of Life CodeForces - 1350E(思维+BFS)
  6. 无线服务器密码让别人改了,wifi密码被改了怎么办_wifi密码被别人改了怎么办?-192路由网...
  7. Typecho博客转移服务器,数据备份
  8. python3.7.2安装pywifi_python pywifi
  9. hive取mysql数据oracle数据,Hive安装过程(mysql/oracle存储元数据)详解
  10. mysql服务的注册,启动、停止、注销。 [delphi代码实现]
  11. 自定义View在android2.3.3手机上正常运行 在android4.2.2手机上报空指针
  12. Java调用cplex求解泊位分配模型_CPLEX约束问题
  13. python 视频剪辑软件_一个Python写的视频剪辑软件,好用!
  14. 判断一个整数是否是7的倍数
  15. unity material之tiling和offset属性
  16. matlab spline边界约束,三阶样条插值(一阶导数边界条件) matlab程序
  17. Carson带你学Android:源码解析自定义View Draw过程
  18. 在VMware中安装新版Ubuntu后,无法跨虚拟机复制粘贴和拖拽文件的解决方法
  19. 北斗B1I测距码特性及程序生成
  20. 钱多多第二阶段冲刺07

热门文章

  1. 【综述专栏】神经网络的可解释性综述
  2. Facebook爆锤深度度量学习:该领域13年来并无进展!网友:沧海横流,方显英雄本色...
  3. 钟南山院士应邀向欧洲同仁全方位解析新冠肺炎(配中文文字版)
  4. 中科院计算所关于“木兰”语言问题处理情况说明
  5. “人工智能之父”艾伦·图灵登上英国50英镑新钞
  6. 2017-2018中国机器人创新Top100榜单深度分析
  7. Gartner:人工智能将改变个人设备领域的游戏规则
  8. 2017年中国自动驾驶最全产业研究报告 99页
  9. 7 年“键盘手”没在意!某程序员手疼查出骨肿瘤,已让骨头成了“豆腐渣”
  10. 前 Google 工程师总结的算法面试指南