虽然说是数位 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] 数字计数的更多相关文章

  1. 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP

    题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...

  2. P2602 [ZJOI2010]数字计数&P1239 计数器&P4999 烦人的数学作业

    P2602 [ZJOI2010]数字计数 题解 DFS 恶心的数位DP 对于这道题,我们可以一个数字一个数字的求 也就是分别统计区间 [ L , R ] 内部数字 i 出现的次数 (0<=i&l ...

  3. P2602 [ZJOI2010]数字计数(递推)

    P2602 [ZJOI2010]数字计数 思路: 首先考虑含有前导0的情况,可以发现在相同的\(i\)位数中,每个数的出现次数都是相等的.所以我们可以设\(f(i)\)为\(i\)位数每个数的出现次数 ...

  4. 数位dp详解&&LG P2602 [ZJOI2010]数字计数

    数位dp,适用于解决一类求x~y之间有多少个符合要求的数或者其他. 例题 题目描述 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除 ...

  5. 洛谷P2602 [ZJOI2010]数字计数(数位dp)

    数字计数 题目传送门 解题思路 用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数. 则转移方程式为:\(dp[i][j][k] += \sum_{t ...

  6. 洛谷P2602 [ZJOI2010]数字计数 题解

    题目描述 输入格式 输出格式 输入输出样例 输入样例 1 99 输出样例 9 20 20 20 20 20 20 20 20 20 说明/提示 数据规模与约定 分析 很裸的一道数位DP的板子 定义f[ ...

  7. [洛谷P2602][ZJOI2010]数字计数

    题目大意:求区间$[l,r]$中数字$0\sim9$出现个数 题解:数位$DP$ 卡点:无 C++ Code: #include <cstdio> #include <iostrea ...

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

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

  9. P2602 [ZJOI2010]数字计数

    https://www.luogu.org/problemnew/show/P2602 数位dp #include <bits/stdc++.h> using namespace std; ...

  10. Luogu P2602 [ZJOI2010]数字计数

    这算是一道数位DP的入门题了吧虽然对于我来说还是有点烦 经典起手式不讲了吧,\(ans(a,b)\to ans(1,b)-ans(1,a-1)\) 我们首先预处理一个东西,用\(f_i\)表示有\(i ...

随机推荐

  1. 【每日一题】【链表or双指针循环条件】2022年2月26日-NC96 判断一个链表是否为回文结构

    描述给定一个链表,请判断该链表是否为回文结构.回文是指该字符串正序逆序完全一致. 思路: public boolean isPail (ListNode head) { ListNode node = ...

  2. 过压保护芯片,高输入电压(OVP)

    PW2606是一种前端过电压和过电流保护装置.它实现了广泛的输入电压范围从2.5V到40V.过电压阈值可在外部编程或设置为内部默认设置.集成功率路径nFET开关的超低电阻确保了更好的性能电池充电系统应 ...

  3. windows下django项目创建流程

    一.创建djangoa项目 1.将python39\Scripts 加入系统环境变量. 2.django-admin startproject 项目名称 二.设置setting 1.语言设置zh-ha ...

  4. Java工厂模式的最佳实践?

    "Simplicity is prerequisite for reliability." - Edsger Dijkstra "简单是可靠的前提条件." -- ...

  5. MySQL简介、下载、密码修改及基本使用

    目录 存取数据的演变史 数据库软件应用史 数据库的本质 数据库的分类 MySQL简介 MySQL基本使用 系统服务的制作 密码相关操作 SQL与NoSQL 数据库重要概念 基本SQL语句 存取数据的演 ...

  6. for循环结构、range方法

    目录 今日内容总结 whlie补充说明 for循环结构 range方法 练习 今日内容总结 whlie补充说明 1.死循环 真正死循环是一旦执行 CPU功耗会急速上升 直到系统采取紧急措施 尽量不要让 ...

  7. 13-flask博客项目之restful api详解2-使用

    13-flask博客项目之restful api详解1-概念 13-flask博客项目之restful api详解1-概念 Flask-RESTful学习网站 英文:https://flask-res ...

  8. RSA_zd网校登录

    网站 aHR0cHM6Ly91c2VyLndhbmd4aWFvLmNuL2xvZ2lu 点到密码登录,会返回验证码 输入错误的账号密码点登录抓包,可以看到密码是被加密的  initator点进去  简 ...

  9. java Jdbc 简单方法

    1.注册驱动(第一种方法) Class.forName(com.mysql.jdbc.Driver"); 2.获得连接DriverManager.getConnection(url,user ...

  10. 对一个序列双重argsort的含义

    学习笔记:由numpy.argsort()引发的思考 一.numpy.argsort() 函数定义 函数的定义 首先函数的定义比较简洁: argsort()函数是将x中的元素从小到大排列,提取其对应的 ...