题解 P2602 [ZJOI2010] 数字计数
虽然说是数位 dp 入门题但是还是不是很会(悲
看了题解才做出来,中途因为各种 SB 问题调了很长时间(悲
聪明的你一定能看出来这是数位 dp,因此令 \(i\) 为当前填的位数,\(limit\) 记录前 \(i - 1\) 位是否与边界相同,\(lead\) 记录前导零。
然后就是伟大的添维了,我们显然要记录目前统计的是哪个数字,然后我们还要记录这个数字出现的次数 \(sum\)。
这个时候 SX 这个天才会问了诶为什么要记录 \(sum\) 啊 \(sum\) 不就是答案吗这不就是脱了屁股放裤子吗?
其实这个我也没研究出个所以然来(悲),我只能说一点我自己浅显的理解,希望有巨佬能指出来我的错误,我的 QQ 是 2392303708 欢迎来喷并且指正 qwq。
首先我们当 \(i = 0\) 时肯定要返回的,返回什么值呢?返回 \(sum\)。我们是以记忆化搜索为框架,每个状态为一个节点会做出一棵树,以下面这张图为例,酱紫:

(反正是给自己看的图丑一点没关系)被红色标记过的链的末端的叶子节点的 \(sum\) 就是这条链上除了最后一个叶子节点要求数码出现次数(其实叶子节点没有数码的说,但是毕竟图都这么画了。。)。请注意我们返回 \(i = 0\) 的情况其实就是给 \(i = 1\) 的情况的,\(i = 1\) 的情况出现的数码次数显然是链上总和。
也就是说其实我们返回 \(i = 0\) 的情况就是给 \(i = 1\) 的状态做准备的┓( \´∀` )┏
因此我们要记录 \(sum\),这样我们才能返回。
至于它要不要记录到状态里面捏。。。反正我开数组记录了,记了肯定没问题如果有不记录的方法 QQ 撅我(喜
//SIXIANG
#include <iostream>
#include <cstring>
#define MAXN 100000
#define int long long
#define QWQ cout << "QWQ" << endl;
using namespace std;
int f[20][114514][2][2], arr[20], tot = 0;
int digit(int i, int sum, int limit, int lead, int num) {
if(!i) return sum;
if(f[i][sum][limit][lead] != -1) return f[i][sum][limit][lead];
int lim = ((limit) ? (arr[i]) : 9), rest = 0;
for(int p = 0; p <= lim; p++)
rest += digit(i - 1, sum + ((p || (!lead)) && (p == num)), (limit && (p == arr[i])), (lead && (!p)), num);
f[i][sum][limit][lead] = rest;
return rest;
}
int solve(int x, int num) {
memset(f, -1, sizeof(f));
memset(arr, 0, sizeof(arr));
tot = 0;
int tmp = x;
do {
arr[++tot] = x % 10;
x /= 10;
} while(x);
return digit(tot, 0, 1, 1, num);
}
signed main() {
int l, r; cin >> l >> r;
for(int p = 0; p <= 9; p++) {
cout << solve(r, p) - solve(l - 1, p) << ' ';
}
}
题解 P2602 [ZJOI2010] 数字计数的更多相关文章
- 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP
题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...
- P2602 [ZJOI2010]数字计数&P1239 计数器&P4999 烦人的数学作业
P2602 [ZJOI2010]数字计数 题解 DFS 恶心的数位DP 对于这道题,我们可以一个数字一个数字的求 也就是分别统计区间 [ L , R ] 内部数字 i 出现的次数 (0<=i&l ...
- P2602 [ZJOI2010]数字计数(递推)
P2602 [ZJOI2010]数字计数 思路: 首先考虑含有前导0的情况,可以发现在相同的\(i\)位数中,每个数的出现次数都是相等的.所以我们可以设\(f(i)\)为\(i\)位数每个数的出现次数 ...
- 数位dp详解&&LG P2602 [ZJOI2010]数字计数
数位dp,适用于解决一类求x~y之间有多少个符合要求的数或者其他. 例题 题目描述 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除 ...
- 洛谷P2602 [ZJOI2010]数字计数(数位dp)
数字计数 题目传送门 解题思路 用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数. 则转移方程式为:\(dp[i][j][k] += \sum_{t ...
- 洛谷P2602 [ZJOI2010]数字计数 题解
题目描述 输入格式 输出格式 输入输出样例 输入样例 1 99 输出样例 9 20 20 20 20 20 20 20 20 20 说明/提示 数据规模与约定 分析 很裸的一道数位DP的板子 定义f[ ...
- [洛谷P2602][ZJOI2010]数字计数
题目大意:求区间$[l,r]$中数字$0\sim9$出现个数 题解:数位$DP$ 卡点:无 C++ Code: #include <cstdio> #include <iostrea ...
- Luogu P2602 [ZJOI2010]数字计数 数位DP
很久以前就...但是一直咕咕咕 思路:数位$DP$ 提交:1次 题解:见代码 #include<cstdio> #include<iostream> #include<c ...
- P2602 [ZJOI2010]数字计数
https://www.luogu.org/problemnew/show/P2602 数位dp #include <bits/stdc++.h> using namespace std; ...
- Luogu P2602 [ZJOI2010]数字计数
这算是一道数位DP的入门题了吧虽然对于我来说还是有点烦 经典起手式不讲了吧,\(ans(a,b)\to ans(1,b)-ans(1,a-1)\) 我们首先预处理一个东西,用\(f_i\)表示有\(i ...
随机推荐
- Nmap常用方法
1.扫描单个目标地址 在Nmap后面直接添加目标地址即可扫描 nmap 目标地址 2.扫描多个目标地址 如果目标不在同一网段,或在同一网段但不连续且数量不多,可以使用该方法进行扫描 nmap ...
- jmeter Foreach 控制器与json提取器/正则表达式
适用场景:对某些业务数据依次操作 如:删除某个用户下的所有人员数据,无批量删除接口时,只能循环调用删除人员接口,直到删除完成 返回数据格式: 1. 使用json提取器或正则表达式提取业务数据(jso ...
- Spring IOC官方文档学习笔记(一)之IOC容器概述
1.IOC容器简介 (1) org.springframework.beans 与 org.springframework.context 这两个包是Spring IOC容器的基础,在org.spri ...
- Cryptohack的Adrien's Signs解题思路
题目如下: 输出的结果: 题目分析: 在原题的题目描述中并没有什么有用的消息,更多的信息是通过代码审计出来的.大致意思是,先把字节flag转换为二进制形式的字符串,然后判断字符串中每个字符,如果为1, ...
- 2022年7月9日 第四组 周鹏 HTML的初认识
<!DOCTYPE html> <html lang="en"> <!-- 文档的根标签 --> <head> & ...
- [seaborn] seaborn学习笔记5-小提琴图VIOLINPLOT
文章目录 5 小提琴图Violinplot 1. 基础小提琴图绘制 Basic violinplot 2. 小提琴图样式自定义 Custom seaborn violinplot 3. 小提琴图颜色自 ...
- [OpenCV实战]21 使用OpenCV的Eigenface
目录 1 PCA 1.1 方差是什么 1.2 什么是PCA 1.3 什么是矩阵的特征向量和特征值? 1.4 如何计算PCA 2 什么是EigenFaces? 2.1 将图像作为向量 2.2 如何计算如 ...
- 3_多维数组转一维数组 reduce()
一,二维数组转一维数组 1 //1. 二维数组转一维数组 2 let arr = [[0,1],[2,3],[4,5]] 3 let newArr = arr.reduce((pre,cur) =&g ...
- Java基础篇——注解和反射
注解 注解Annotation可以被其他程序(编译器)读取,常见的有@override 内置注解 @Override 适用于修饰方法,表明重写父类中的一个方法 @Deprecated 用于修饰类.方法 ...
- Java 进阶P-8.9+P-8.10
文件流 File Input Stream File Output Stream 对文件作读写操作 实际工程中已经较少使用 更常用的是以在内存数据或通信数据上建立的流,如数据库的二进制数据读写或网络端 ...