题目:

(传送门)[http://www.lydsy.com/JudgeOnline/problem.php?id=1833]

题解:

第一次接触数位dp,真的是恶心。

首先翻阅了很多很多一维dp,因为要处理前缀0,所以根本搞不懂。

查询了dalaolidaxin的博客,又查阅了资料:

初探数位dp

才完全弄懂这个题。

具体的,我们设

f[i][j][k]为考虑所有i位数,最高位为j数,之中k的数目。

我们可以得出方程:

\[f[i][j][k] = \sum f[i-1][l][k] (j!=k)
\]

\[f[i][j][k] = \sum f[i-1][l][k] + 10^{i-1} (j==k)
\]

我们对这个方程作出解释:

前一项非常好理解,后一项的话就是前(i-1)位数共有\(10^{i-1}\)个,对于其中每一个,我们都可以在前面加k。

这样我们预处理出来了f。

然后我们考虑对于n分块计算。

以n = 4321为例。

首先统计3位及以下的数,这些数字没有限制,直接加就好。

然后统计4位数。

对于一个4位数,我们一位一位向下考虑,如果最高位<k,直接加,如果=k,加上n+1

具体见代码。

代码

#include <cstdio>
#include <cstring>
using namespace std;
#define ll long long
const int N = 25;
struct node {
ll a[N];
node() { memset(a, 0, sizeof(a)); }
ll &operator[](const int &x) { return a[x]; }
};
node operator+(const node &x, const node &y) {
node tmp;
for (int i = 0; i <= 9; i++)
tmp.a[i] = x.a[i] + y.a[i];
return tmp;
}
int len, a[N];
ll pow[N];
node f[N][N];
void init(ll n) {
len = 0;
while (n) {
a[++len] = n % 10;
n /= 10;
}
for (int i = 0; i <= 9; i++)
f[1][i][i] = 1;
for (int i = 2; i <= 14; i++) {
for (int j = 0; j <= 9; j++) {
for (int k = 0; k <= 9; k++)
f[i][j] = f[i][j] + f[i - 1][k];
f[i][j][j] += pow[i - 1];
}
}
}
node calc(ll n) {
node ans;
if (!n)
return ans;
memset(f, 0, sizeof(f));
init(n);
//统计前len-1位
for (int i = 1; i <= len - 1; i++) {
for (int j = 1; j <= 9; j++) {
ans = ans + f[i][j];
}
}
//开始统计len位数
for (int i = 1; i <= a[len] - 1; i++)
ans = ans + f[len][i];
n %= pow[len - 1];
ans[a[len]] += n + 1; //对于每一个最高位都可以统计一发
for (int i = len - 1; i; i--) {
for (int j = 0; j < a[i]; j++)
ans = ans + f[i][j];
n %= pow[i - 1];
ans[a[i]] += n + 1;
}
return ans;
}
int main() {
pow[0] = 1;
for (int i = 1; i <= 14; i++)
pow[i] = pow[i - 1] * 10;
ll x, y;
scanf("%lld %lld", &x, &y);
node ans1 = calc(y), ans2 = calc(x - 1);
for (int i = 0; i <= 8; i++)
printf("%lld ", ans1[i] - ans2[i]);
printf("%lld\n", ans1[9] - ans2[9]);
return 0;
}

[bzoj1833][ZJOI2010]count 数字计数——数位dp的更多相关文章

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

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

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

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

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

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

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

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

  5. BZOJ 1833 ZJOI2010 count 数字计数 数位DP

    题目大意:求[a,b]间全部的整数中0~9每一个数字出现了几次 令f[i]为i位数(算前导零)中每一个数出现的次数(一定是同样的,所以仅仅记录一个即可了) 有f[i]=f[i-1]*10+10^(i- ...

  6. BZOJ1833 ZJOI2010 count 数字计数 【数位DP】

    BZOJ1833 ZJOI2010 count 数字计数 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包 ...

  7. [BZOJ1833][ZJOI2010]count 数字计数

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

  8. BZOJ1833 [ZJOI2010]count 数字计数 【数学 Or 数位dp】

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

  9. bzoj1833: [ZJOI2010]count 数字计数&&USACO37 Cow Queueing 数数的梦(数位DP)

    难受啊,怎么又遇到我不会的题了(捂脸) 如题,这是一道数位DP,随便找了个博客居然就是我们大YZ的……果然nb,然后就是改改模版++注释就好的了,直接看注释吧,就是用1~B - 1~A-1而已,枚举全 ...

随机推荐

  1. linux通用GPIO驱动,写GPIO文件不立即生效问题解决

    Linux开发平台实现了通用GPIO的驱动,用户通过,SHell或者系统调用能控制GPIO的输出和读取其输入值.其属性文件均在/sys/class/gpio/目录下,该目录下有export和unexp ...

  2. python基础之模块part2

    sys: sys模块不同于os模块,这个是跟Python解释器打交道的. sys.argv:返回一个文件名开头,包含后面输入内容的 列表 import sys res = sys.argv print ...

  3. Python os.walk() 简介

    Table of Contents 1. os.walk目录遍历 1.1. os.walk 1.2. 例子 1.2.1. 测试topdown 1.2.2. 运行时修改遍历目录 2. 参考资料 os.w ...

  4. Windows GitLab使用全过程

    1.首先安装Git 1.1.下载网站: https://git-for-windows.github.io/ 1.2.安装Git参考网站 http://blog.csdn.net/u012614287 ...

  5. QQ空间相册展示特效

    <!doctype html> <html lang="en"> <head> <title>QQ空间相册展示特效<title ...

  6. C# Json 序列化大全--任我行

    public class JsonHelper { /// <summary> /// 将Model转换为Json字符串 /// </summary> /// <type ...

  7. 发送广播重新挂载SD卡,使图库可以及时显示自己保存的图片(无需手机重启)

    我们或许经常会遇到这种情况,明明保存了图片,但是当你打开图片时,却没有找到这张图片,手机重启之后才能看到.这是因为SD卡并没有重新挂载,图库也无法把这张图片加载进去,解决这个问题非常简单,只需要我们模 ...

  8. 通过学习制作长微博工具来了解水印的制作,及EditText中的内容在图片中换行显示

    长微博工具非常有用,140字的要求可能阻止你写更多的内容,于是长微博工具应运而生,虽然网上有很多长微博工具,但是我都不是很满意,所以自己想做一个,通过做这个长微博工具,我学习到了很多东西,有两个难点, ...

  9. 使用Unity做项目的时候,一些好的建议

    内容来自这个网站http://devmag.org.za/2012/07/12/50-tips-for-working-with-unity-best-practices/ ,我选取了目前我看得懂的一 ...

  10. Xcode坑之一Invalid argument

    Xcode坑之一Invalid argument 正在搞代码,运行程序时突然发现程序不能再次运行了,一运行就提示Invalid argument 然后FQ各种查啊,试了好多方法都不行,重启,重置,我用 ...