题目链接: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. Strange Way to Express Integers

    I. Strange Way to Express Integers 题目描述 原题来自:POJ 2891 给定 2n2n2n 个正整数 a1,a2,⋯,ana_1,a_2,\cdots ,a_na​ ...

  2. 第三期 行为规划——4.形式化FSM

    让我们考虑一个简单的自动售货机,其中一切花费20美分.假设这台自动售货机只需要镍和硬币,但没有更大或更小. 然后,我们可以模拟状态这台自动售货机以已存入的金额为准.起始状态将为零美分.有两种可能发生. ...

  3. better-scroll在移动端绑定click事件失效

    在做一个列表的时候需要点击列表将列表信息输出,给<li>加个一个很简单的@click,可是没有反应. 原因是使用了better-scroll,默认它会阻止touch事件.所以在配置中需要加 ...

  4. hdu 1430 魔板 (BFS+预处理)

    Problem - 1430 跟八数码相似的一题搜索题.做法可以是双向BFS或者预处理从"12345678"开始可以到达的所有状态,然后等价转换过去直接回溯路径即可. 代码如下: ...

  5. 实现三个div,固定左右两边的div宽为200,中间的div宽度自适应的四种方法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 在 Jenkins Windows Agent 节点上执行 Shell 命令

    Jenkins 在 Windows agent 上执行shell 命令,听起来很有意思,以下方法可以在 Jenkins 中执行一些简单的 shell 脚本,如果是复杂脚本就交给 Linux agent ...

  7. Java RandomAccessFile用法(转载)

    RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必相同:但是其大小和位置必须 ...

  8. mybatis 逆向工程(通过数据库表针对单表自动生成mybatis执行所需要的代码)

    mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表自动生成mybatis执行所需要的代码(mapper.java.mapper.xml.pojo…),可以让程序员 ...

  9. tensorflow学习笔记(二十五):ConfigProto&GPU

    tensorflow ConfigPrototf.ConfigProto一般用在创建session的时候.用来对session进行参数配置 with tf.Session(config = tf.Co ...

  10. 获取exe和dll里面的资源

    有时候需要仿照另一个程序实现一些对话框,比较笨的办法是打开那个程序,照着样子自己在VC里面画啊画.这样的效率实在有点低. 现在有很多工具可以从exe和dll里面取出图片.图片.字符串.对话框等资源.比 ...