题解 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 ...
随机推荐
- 【每日一题】【链表or双指针循环条件】2022年2月26日-NC96 判断一个链表是否为回文结构
描述给定一个链表,请判断该链表是否为回文结构.回文是指该字符串正序逆序完全一致. 思路: public boolean isPail (ListNode head) { ListNode node = ...
- 过压保护芯片,高输入电压(OVP)
PW2606是一种前端过电压和过电流保护装置.它实现了广泛的输入电压范围从2.5V到40V.过电压阈值可在外部编程或设置为内部默认设置.集成功率路径nFET开关的超低电阻确保了更好的性能电池充电系统应 ...
- windows下django项目创建流程
一.创建djangoa项目 1.将python39\Scripts 加入系统环境变量. 2.django-admin startproject 项目名称 二.设置setting 1.语言设置zh-ha ...
- Java工厂模式的最佳实践?
"Simplicity is prerequisite for reliability." - Edsger Dijkstra "简单是可靠的前提条件." -- ...
- MySQL简介、下载、密码修改及基本使用
目录 存取数据的演变史 数据库软件应用史 数据库的本质 数据库的分类 MySQL简介 MySQL基本使用 系统服务的制作 密码相关操作 SQL与NoSQL 数据库重要概念 基本SQL语句 存取数据的演 ...
- for循环结构、range方法
目录 今日内容总结 whlie补充说明 for循环结构 range方法 练习 今日内容总结 whlie补充说明 1.死循环 真正死循环是一旦执行 CPU功耗会急速上升 直到系统采取紧急措施 尽量不要让 ...
- 13-flask博客项目之restful api详解2-使用
13-flask博客项目之restful api详解1-概念 13-flask博客项目之restful api详解1-概念 Flask-RESTful学习网站 英文:https://flask-res ...
- RSA_zd网校登录
网站 aHR0cHM6Ly91c2VyLndhbmd4aWFvLmNuL2xvZ2lu 点到密码登录,会返回验证码 输入错误的账号密码点登录抓包,可以看到密码是被加密的 initator点进去 简 ...
- java Jdbc 简单方法
1.注册驱动(第一种方法) Class.forName(com.mysql.jdbc.Driver"); 2.获得连接DriverManager.getConnection(url,user ...
- 对一个序列双重argsort的含义
学习笔记:由numpy.argsort()引发的思考 一.numpy.argsort() 函数定义 函数的定义 首先函数的定义比较简洁: argsort()函数是将x中的元素从小到大排列,提取其对应的 ...