题目链接

做的第一道数位DP题,听说是最基础的模板题,但还是花了好长时间才写出来。。。。。

想深入了解下数位DP的请点这里

先设dp数组dp[i][j][k]表示数位是i,以j开头的数k出现的次数

有 

数位dp的题一般都会用到前缀数组,题目要求我们求b-a这个区间里各个数码出现的次数,我们可以分别求出(0,b)和(0,a-1)然后相减即可

具体分析请看代码,写的还算详细

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[][][];
ll ans[];//用来储存每个数码出现的次数
ll bin[];//表示i位数中数码i出现的次数
ll d[];//这个用来存储数的每一位
void rule(){
bin[]=;
for(int i=;i<;i++) bin[i]=bin[i-]*;
for(int i=;i<;i++) dp[][i][i]=;
for(int i=;i<=;i++){
for(int j=;j<=;j++){
for(int z=;z<=;z++){
for(int k=;k<=;k++)
dp[i][j][z]+=dp[i-][k][z];//比如i=2,j=2时,所求数字范围应该是200-299,这一步把0-99中各数码出现次数加进去
dp[i][z][z]+=bin[i-];//这一位这是把200-299总共出现了100次的2给加进去
}
}
}
}
void solve(ll x,int flag){
ll tmpx=x;//存储传进来的x
int cnt=;//记录x的位数
memset(d,,sizeof(d));
while(x){
d[++cnt]=x%;
x/=;
}
for(int i=;i<cnt;i++){//这一步是最高位为0的,这些数都不会受到x的上限限制,都可以直接加进来
for(int j=;j<=;j++){
for(int k=;k<=;k++)
ans[k]+=dp[i][j][k]*flag;
}
}
int tmpt=cnt;
while(cnt){//可以举个456的例子来仔细分析一下
for(int i=;i<d[cnt];i++){//注意这里是小于不是等于,保证上限不被取到,在后面再被处理
if(!i&&cnt==tmpt) continue;//这种情况在最高位为0时已经统计过了,不能重复
for(int j=;j<=;j++){
ans[j]+=dp[cnt][i][j]*flag;//不是上限的时候都直接加
}
}
ans[d[cnt]]+=(tmpx%bin[cnt]+)*flag;cnt--;//随着while循环,上限一步步的被处理
}//简述一下过程(456),就是第一个for处理了0-399,然后把首位4的57次加上,第二个for,处理的0-49......就这样一步步往下
}
int main(){
ll a,b;scanf("%lld%lld",&a,&b);
rule();
solve(b,);solve(a-,-);//1和-1是符号位,分别是加和减
for(int i=;i<;i++)
printf("%lld%c",ans[i],i==?'\n':' ');
return ;
}

BZOJ 1833 数字计数 数位DP的更多相关文章

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

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

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

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

  3. 【BZOJ-1833】count数字计数 数位DP

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2494  Solved: 1101[Submit][ ...

  4. [BZOJ 1833] 数字计数

    Link: BZOJ 1833 传送门 Solution: 比较明显的数位DP 先预处理出1~9和包括前导0的0的个数:$pre[i]=pre[i-1]*10+10^{digit-1}$ (可以分为首 ...

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

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

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

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

  7. 【题解】P2602 数字计数 - 数位dp

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

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

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

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

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

随机推荐

  1. Docker 配置阿里云镜像加速器

    由于国内访问直接访问docker hub网速比较慢,拉取镜像的时间就会比较长.一般我们会使用镜像加速或者直接从国内的一些平台镜像仓库上拉取. 根据网上提供的方案,有网易,daocloud,ustc等解 ...

  2. centos远程访问

    centos远程访问即windows下的mysql和linux下的mysql能连接,即windows下的navicat能连接到(访问)centos下的mysql中的库表 (centos是linux的一 ...

  3. NOIP队内凉心互测总结(8.22update)

    8.22(结束后一天) __stdcall讲题qwq 全是CF原题 D1T1 一看像是结论题,打了下表,水过 没错就是结论题,直接暴力就好 D1T2 看起来不好做,没有AC思路 打了暴力 40分 T2 ...

  4. Linux中.rar文件解压

    1. 下载: https://www.rarlab.com/download.htm 我下载的是RAR 5.61 for Linux x64 2. 安装: 解压:tar -zxvf rarlinux- ...

  5. URAL 1004 Sightseeing Trip(floyd求最小环+路径输出)

    https://vjudge.net/problem/URAL-1004 题意:求路径最小的环(至少三个点),并且输出路径. 思路: 一开始INF开大了...无限wa,原来相加时会爆int... 路径 ...

  6. MySQL 的 DISTINCT 应用于2列时

    SELECT DISTINCT vend_id告诉MySQL只返回不同(唯一)的 vend_id行,也就是在vend_id 有重复的行中,只保留一行,其他的不作输出.比如我创建了如下的student表 ...

  7. 使用padding值控制控件的隐藏与显示

    在学自定义控件下拉刷新这一案例,控制ListView头条目和尾条目的显示隐藏时,就是设置其padding值的正负控制其的显示与隐藏.这并不是什么很大的知识点.只是一个小技巧,这里给大家分享一下. 这一 ...

  8. 大话WebRTC的前世今生

    音视频的历史 音视频可以说是人类与生俱来的需求,人一出生就要用耳朵听,用眼睛看.中国的古代神话中为此还专门设置了两位神仙(千里眼和顺风耳),他们可以听到或看到千里之外的声音或景像. 为了解决听的远和看 ...

  9. linux安装vmware

    在官网下载linux版 https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html sudo chm ...

  10. 全排列问题Ⅰ(Java实现)

    给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1 ...