HDU3709 Balanced Number 题解 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709
题目大意:
求区间 \([x, y]\) 范围内“平衡数”的数量。
所谓平衡数是指:以某一位为支点,它左边的所有位的数乘以它到支点的距离之和等于它右边的所有位的数乘以它到支点的距离之和。
比如, \(4139\) 是平衡数,因为以 \(3\) 为支点,
- 左边的每一位数与距离的乘积和为 \(4 \times 2 + 1 \times 1 = 9\);
- 右边的每一位数与距离的乘积和为 \(9 \times 1 = 9\)
所以左右两边的数与距离的乘积和是相等的,所以 \(4139\) 是一个平衡数。
问题分析:
对于这道题,我们需要先枚举支点在哪一位,
然后,在确定支点所在的位的基础上,进行 数位DP 。
我们设状态 \(f[cid][pos][delta]\) 表示:
- 枚举的支点在第 \(cid\) 位,
- 当前所处的数位为 \(pos\),
- \(delta\) 为从最高位到第 \(pos + 1\) 位的每一位上的数字 \(num_i\) 与其与 \(col\) 位的距离的乘积和 \(\sum num_i \times (i-col)\)
然后我们开函数 dfs(int cid, int pos, int delta, bool limit),其中:
cid、pos、delta的含义同上;limit表示当前是否处于限制状态。
只要 pos<0 时 delta==0 则找到一种情况。
注意:因为枚举每一位 col 时,数字 \(0\) 的情况都会计算上去,所以需要在枚举每一位是都减去 \(0\) 的情况,最后再加上 \(0\) 的情况。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
long long f[20][20][1800], a[20];
void init() {
memset(f, -1, sizeof(f));
}
long long dfs(int cid, int pos, int delta, bool limit) {
if (pos < 0) return !delta;
if (!limit && f[cid][pos][delta] != -1) return f[cid][pos][delta];
int up = limit ? a[pos] : 9;
long long tmp = 0;
for (int i = 0; i <= up; i ++) {
int d = delta + (pos-cid)*i;
if (d < 0) continue;
tmp += dfs(cid, pos-1, d, limit && i==up);
}
if (!limit) f[cid][pos][delta] = tmp;
return tmp;
}
long long get_num(long long x) {
if (x < 0) return 0;
int pos = 0;
long long res = 0;
while (x) {
a[pos++] = x % 10;
x /= 10;
}
for (int cid = 0; cid < pos; cid ++) {
res += dfs(cid, pos-1, 0, true);
res -= 1; // 减去0的情况
}
return res + 1; // 加上0的情况
}
int T;
long long x, y;
int main() {
init();
scanf("%d", &T);
while (T --) {
scanf("%lld%lld", &x, &y);
printf("%lld\n", get_num(y) - get_num(x-1));
}
return 0;
}
HDU3709 Balanced Number 题解 数位DP的更多相关文章
- HDU3709 Balanced Number (数位dp)
Balanced Number Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Descript ...
- HDU 3709 Balanced Number(数位DP)题解
思路: 之前想直接开左右两边的数结果爆内存... 枚举每次pivot的位置,然后数位DP,如果sum<0返回0,因为已经小于零说明已经到了pivot右边,继续dfs只会越来越小,且dp数组会炸 ...
- 【HDU 3709】 Balanced Number (数位DP)
Balanced Number Problem Description A balanced number is a non-negative integer that can be balanced ...
- HDU - 3709 - Balanced Number(数位DP)
链接: https://vjudge.net/problem/HDU-3709 题意: A balanced number is a non-negative integer that can be ...
- [HDOJ3709]Balanced Number(数位dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709 题意:求区间[L,R]内每一个数中是否存在一位,使得左边的各位数*距离=右边的各位数*距离(自己 ...
- HDU5179 beautiful number 题解 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5179 题目大意: 给你一个数 \(A = a_1a_2 \cdots a_n\) ,我们称 \(A\) ...
- hdu 3709 Balanced Number(数位dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709 题意:给定区间[a,b],求区间内平衡数的个数.所谓平衡数即有一位做平衡点,左右两边数字的力矩相 ...
- HDU 3709 Balanced Number (数位DP)
题意: 找出区间内平衡数的个数,所谓的平衡数,就是以这个数字的某一位为支点,另外两边的数字大小乘以力矩之和相等,即为平衡数. 思路: 一开始以为需要枚举位数,枚举前缀和,枚举后缀和,一旦枚举起来就会M ...
- HDU3709 Balanced Number —— 数位DP
题目链接:https://vjudge.net/problem/HDU-3709 Balanced Number Time Limit: 10000/5000 MS (Java/Others) ...
随机推荐
- CDQ分治 三维偏序
这应该是一道CDQ分治的入门题目 我们知道,二维度的偏序问题直接通过,树状数组就可以实现了,但是三维如何实现呢? 我记得以前了解过一个小故事,应该就是分治的. 一个皇帝,想给部下分配任务,但是部下太多 ...
- behavior planning——14.implement a cost function in C++
n most situations, a single cost function will not be sufficient to produce complex vehicle behavior ...
- activiti工作流引擎之uel表达式
qq讨论群:313032825本人做了一个微信公众号,用于分享各类视频学习资源和我多年学习经验,喜欢的可以关注哦! 有了前面几章,我们肯定有一定的困惑,activiti如何与实际业务整合,比如一条采购 ...
- H3C 电路交换连接模型
- docker 使用总结
docker run asn@hadoop1:~/Desktop$ docker run --help Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG ...
- H3C PPP基本配置
- 百度小程序富文本bdParse遇到的坑
百度开发工具能正常显示文章图文详情, web浏览也可以, app浏览就不行, 审核说兼容性问题, 都不是, 后来发现是后台传输的数据问题, 不能用json_encode()返回数据
- [转]vue router基本使用
第一步:安装 cnpm install vue-router --save 路由配置基本语法 router下index.js引入 import Vue from "vue"; im ...
- 2018-8-10-UWP-分享用那个图标
title author date CreateTime categories UWP 分享用那个图标 lindexi 2018-08-10 19:16:52 +0800 2018-2-13 17:2 ...
- 有趣的一行 Python 代码
https://mp.weixin.qq.com/s/o9rm4tKsJeEWyqQDgVEQiQ https://mp.weixin.qq.com/s/G5F_GaUGI0w-kugOZX145g ...