题目链接: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),其中:

  • cidposdelta的含义同上;
  • limit 表示当前是否处于限制状态。

只要 pos<0delta==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的更多相关文章

  1. HDU3709 Balanced Number (数位dp)

     Balanced Number Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Descript ...

  2. HDU 3709 Balanced Number(数位DP)题解

    思路: 之前想直接开左右两边的数结果爆内存... 枚举每次pivot的位置,然后数位DP,如果sum<0返回0,因为已经小于零说明已经到了pivot右边,继续dfs只会越来越小,且dp数组会炸 ...

  3. 【HDU 3709】 Balanced Number (数位DP)

    Balanced Number Problem Description A balanced number is a non-negative integer that can be balanced ...

  4. HDU - 3709 - Balanced Number(数位DP)

    链接: https://vjudge.net/problem/HDU-3709 题意: A balanced number is a non-negative integer that can be ...

  5. [HDOJ3709]Balanced Number(数位dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709 题意:求区间[L,R]内每一个数中是否存在一位,使得左边的各位数*距离=右边的各位数*距离(自己 ...

  6. HDU5179 beautiful number 题解 数位DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5179 题目大意: 给你一个数 \(A = a_1a_2 \cdots a_n\) ,我们称 \(A\) ...

  7. hdu 3709 Balanced Number(数位dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709 题意:给定区间[a,b],求区间内平衡数的个数.所谓平衡数即有一位做平衡点,左右两边数字的力矩相 ...

  8. HDU 3709 Balanced Number (数位DP)

    题意: 找出区间内平衡数的个数,所谓的平衡数,就是以这个数字的某一位为支点,另外两边的数字大小乘以力矩之和相等,即为平衡数. 思路: 一开始以为需要枚举位数,枚举前缀和,枚举后缀和,一旦枚举起来就会M ...

  9. HDU3709 Balanced Number —— 数位DP

    题目链接:https://vjudge.net/problem/HDU-3709 Balanced Number Time Limit: 10000/5000 MS (Java/Others)     ...

随机推荐

  1. How do I cover the “no results” text in UISearchDisplayController's searchResultTableView?

    How do I cover the "no results" text in UISearchDisplayController's searchResultTableView? ...

  2. 一、JVM内存区域组成

    一.JVM内存区域组成  java把内存分四种:  1.栈区(stack segment)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放内存资源  2. ...

  3. angular input框点击别处 变成不可输入状态

    <input type="text" ng-model="edit" ng-disabled="!editable" focus-me ...

  4. 使用php函数ini_set()重新设置某个配置的设置值

    使用PHP的ini_set()函数 ini_set (PHP 4, PHP 5, PHP 7) ini_set — 为一个配置选项设置值 说明 string ini_set ( string $var ...

  5. 分布式TensorFlow集群local server使用详解

    通过local server理解分布式TensorFlow集群的应用与实现. ​​简介 TensorFlow从0.8版本开始,支持分布式集群,并且自带了local server方便测试. Local ...

  6. Vue中computed与method的区别

    转载于:https://segmentfault.com/a/1190000014478664?utm_source=tag-newest 1.computed区别于method的两个核心 在官方文档 ...

  7. codeforces 609C

    #include<bits/stdc++.h> using namespace std; ],c[]; int main() { int n,i; while(cin >> n ...

  8. 基于串口调试助手的WIFI模块调试-FPGA简单联网(点灯)

    根据正点原子的<ATK-ESP8266 WIFI用户手册>,使用XCOM V2.2串口调试助手测试WIFI模块[26].在本系统中运用到的功能主要是TCP/IP模式中的TCP Client ...

  9. P1034 台阶问题一

    题目描述 有 \(N\) 级的台阶,你一开始在底部,每次可以向上迈最多2级台阶(最少1级),问到达第 \(N\) 级台阶有多少种不同方式. 输入格式 一个正整数 \(N(\le 20)\) . 输出格 ...

  10. springboot配置大全

    此配置大全是在官方开发者文档中看到的,地址:https://docs.spring.io/spring-boot/docs/1.5.6.RELEASE/reference/html/common-ap ...