洛谷P2602 [ZJOI2010]数字计数 题解 数位DP
题目链接:https://www.luogu.com.cn/problem/P2602
题目大意:
计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次?
解题思路:
使用 数位DP 进行求解。
定义一个结构体数组 \(f[pos][all0]\) 表示满足如下条件时 \(0 \sim 9\) 出现的次数:
- 当前所在数位为第 \(pos\) 位;
- \(all0\) 为 \(1\) 表示当前状态之前一直都是前置 \(0\) ,为 \(0\) 表示前面的数位上面出现过不为 \(0\) 的数。
然后定义一个返回值为此结构体类型的函数 dfs(int pos, int all0, bool limit)
进行求解,其中:
- \(pos\) 和 \(all0\) 的含义同上;
- \(limit\) 表示是否处于限制状态。
实现代码如下:
// P2602 [ZJOI2010]数字计数
#include <bits/stdc++.h>
using namespace std;
long long cnt[10], pow10[22], num;
int a[22];
struct Node {
long long arr[10];
Node() { memset(arr, 0, sizeof(arr)); }
void merge(Node v) {
for (int i = 0; i < 10; i ++)
arr[i] += v.arr[i];
}
} f[22][2];
bool vis[22][2];
void init() {
pow10[0] = 1;
for (int i = 1; i <= 18; i ++) pow10[i] = pow10[i-1] * 10;
}
Node dfs(int pos, int all0, bool limit) {
if (pos < 0) return Node();
if (!limit && vis[pos][all0]) return f[pos][all0];
int up = limit ? a[pos] : 9;
Node tmp = Node();
for (int i = 0; i <= up; i ++) {
if (i == 0 && all0 && pos>0) ;
else {
if (limit && i==up) tmp.arr[i] += num % pow10[pos] + 1;
else tmp.arr[i] += pow10[pos];
}
tmp.merge(dfs(pos-1, all0&&i==0, limit&&i==up));
}
if (!limit) {
vis[pos][all0] = true;
f[pos][all0] = tmp;
}
return tmp;
}
Node get_num(bool minus1) {
long long x;
cin >> x;
if (minus1) x --;
num = x;
int pos = 0;
while (x) {
a[pos++] = x % 10;
x /= 10;
}
if (num == 0) a[pos++] = 0;
return dfs(pos-1, true, true);
}
int main() {
init();
Node res_l = get_num(true);
Node res_r = get_num(false);
for (int i = 0; i < 10; i ++) {
if (i) putchar(' ');
cout << res_r.arr[i] - res_l.arr[i];
}
cout << endl;
return 0;
}
洛谷P2602 [ZJOI2010]数字计数 题解 数位DP的更多相关文章
- 洛谷P2602 [ZJOI2010] 数字计数 (数位DP)
白嫖的一道省选题...... 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 usin ...
- 洛谷P2602 [ZJOI2010]数字计数 题解
题目描述 输入格式 输出格式 输入输出样例 输入样例 1 99 输出样例 9 20 20 20 20 20 20 20 20 20 说明/提示 数据规模与约定 分析 很裸的一道数位DP的板子 定义f[ ...
- 洛谷P2602 [ZJOI2010]数字计数(数位dp)
数字计数 题目传送门 解题思路 用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数. 则转移方程式为:\(dp[i][j][k] += \sum_{t ...
- 洛谷 P2602 [ZJOI2010]数字计数
洛谷 第一次找规律A了一道紫题,写篇博客纪念一下. 这题很明显是数位dp,但是身为蒟蒻我不会呀,于是就像分块打表水过去. 数据范围是\(10^{12}\),我就\(10^6\)一百万一百万的打表. 于 ...
- [洛谷P2602][ZJOI2010]数字计数
题目大意:求区间$[l,r]$中数字$0\sim9$出现个数 题解:数位$DP$ 卡点:无 C++ Code: #include <cstdio> #include <iostrea ...
- 洛谷P2606 [ZJOI2010]排列计数(数位dp)
题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有多少是Magic的,答案可能很 ...
- 【洛谷】2602: [ZJOI2010]数字计数【数位DP】
P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入输出格式 输入格式: 输入文件中仅包含一行两个整数a ...
- BZOJ1833或洛谷2602 [ZJOI2010]数字计数
BZOJ原题链接 洛谷原题链接 又是套记搜模板的时候.. 对\(0\sim 9\)单独统计. 定义\(f[pos][sum]\),即枚举到第\(pos\)位,前面枚举的所有位上是当前要统计的数的个数之 ...
- 【洛谷P2602】数字计数
题目大意:求 [a,b] 中 0-9 分别出现了多少次. 题解:看数据范围应该是一个数位dp. 在 dfs 框架中维护当前的位置和到当前位置一共出现了多少个 \(x,x\in [0,9]\).因此,用 ...
随机推荐
- Redis源码解析:02链表
链表提供了高效的节点重排能力,以及顺序性的节点访问方式,因为Redis使用的C语言并没有内置这种数据结构,所以Redis自己实现了链表. 链表在Redis中的应用非常广泛,比如列表的底层实现之一就是链 ...
- behavior planning——10 behaior planning pseudocode
One way to implement a transition function is by generating rough trajectories for each accessible & ...
- Android Studio(一):介绍、安装、配置
Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...
- SuperSocket从服务器端主动发起连接
你可以从服务器端主动连接客户端, 连接建立之后的网络通信处理将和客户端主动建立连接的处理方式一样. var activeConnector = appServer as IActiveConnecto ...
- jQuery的引入和使用
https://www.cnblogs.com/sandraryan/ 前端代码优化:无效循环越少越好,DOM节点操作越少越好,HTTP请求越少越好 jq是一个js库.(不是框架) JQ优点 1. 方 ...
- Python--day69--pythonDjango终端打印SQL语句、在Python脚本中调用Django环境
Django终端打印SQL语句 在Django项目的settings.py文件中,在最后复制粘贴如下代码: LOGGING = { 'version': 1, 'disable_existing_lo ...
- java 集合类 & 容器
为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就要对对象进行存储,集合就是存储对象最常用的一种方式. 数组和集合类同是容器,有何不同? 数组虽然也可以存储 ...
- Python--day31--UDP协议的socket通信
- Codeforces Round #184 (Div. 2)
A. Strange Addition (目前的做法好像做烦了) 统计数的\(mask\),表示个.十.百位上是否是0,共8种数. 枚举8种数组成的所有情况\(2^8\),记录最大数量. B. Con ...
- [转]WebApi 后端文件传输至远程服务器
/* 功能说明:微信退款需要有数字证书,而我们公司是做小程序平台的,会帮商家自动退款,所以会要求商家把微信证书上传至我们服务器,以便 微信退款. 使用HttpPostedFile 接受前端上传的文件, ...