题目链接:点击查看

题目大意:将一串数字视为天平,两端平衡的数字称为平衡数,并求出一段闭区间中平衡数的个数。所谓的平衡条件即为力臂与

力相乘后两端的数量和可以抵消,例如数字4139可以视为以3为中轴的天平,天平左边:4*2+3*1=9,天平右边:9*1=9。

题目分析:数位dp,输入一个数后对其每一位进行枚举测试,即令该位置当中轴时,统计满足条件的个数,最后再减去(len-1)即

可,因为0被多算了len-1次。

这个题中令dp[len][pos][sum],len指的是每一位,pos指的是当前当做中轴的位置,sum指的是从最高位深搜到最后一个位置中

力臂与力乘积的总和,即中轴左侧的sum总是递增,sum在右侧总是递减,可以利用这个性质剪枝,即sum<0时可以直接返回0

了,因为已经不可能达到平衡了。

注意在开数组的时候,因为范围内的数字最大只有18位,所以假设每次都是极端情况,即每位上的数字最大,例如9999....

这样力臂与力的乘积变成了9*(18-1)+9*(18-2).....9*1<=9*18*18=2916<=3000,所以sum的数组开到3000就已经稳够了

上代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
#include<cmath>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=800;int k;LL dp[25][25][3000];int b[25];LL dfs(int len,int pos,int sum,bool limit)
{if(len==-1)return sum==0;if(sum<0)return 0;if(!limit&&dp[len][pos][sum]!=-1)return dp[len][pos][sum];int up=limit?b[len]:9;LL ans=0;for(int i=0;i<=up;i++){ans+=dfs(len-1,pos,sum+(len-pos)*i,limit&&i==b[len]);}if(!limit)dp[len][pos][sum]=ans;return ans;
}LL solve(LL n)
{int cnt=0;while(n){b[cnt++]=n%10;n/=10;}LL ans=0;for(int i=0;i<cnt;i++){ans+=dfs(cnt-1,i,0,true);}return ans-cnt+1;
}int main()
{
//  freopen("input.txt","r",stdin);memset(dp,-1,sizeof(dp));int w;cin>>w;while(w--){LL a,b;cin>>a>>b;cout<<solve(b)-solve(a-1)<<endl;}return 0;
}

HDU - 3709 Balanced Number(数位dp)相关推荐

  1. HDU 3709 Balanced Number (数位DP)

    题意 求出[x, y] 范围内的平衡数,平衡数定义为:以数中某个位为轴心,两边的数的偏移量为矩,数位权重,使得整个数平衡. 思路 外层枚举平衡点,然后数位DP即可.设计状态: dp[pos][o][l ...

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

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

  3. HDU 3709 Balanced Number

    Balanced Number 题意: 平衡数:存在该数中以一个数字为支点(pivot),点的"力矩"为该点到支点的距离乘以该点的值,而平衡指的是支点两侧的力矩和相等 思路: 易知 ...

  4. HDU - 3709 (Balanced Number)

    题意:设一个数的十进制表达是 a1a2a3...an ,则它是 Balanced Number 的定义是:存在一个位置 i <=n,使得:  问区间[l,r] 内有多少个数是 Balanced ...

  5. HDU 5787 wolf Number 数位dp

    题意 题目就是说让我们在l到r的数字中求得有多少个连续k为不相同的数 1≤L≤R≤1e18 2≤K≤5 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  6. HDU odd-even number 数位dp

    题意 在l到r区间内求有多少个符合条件"当前数中所有连续的奇数长度是偶数 所有连续的偶数长度是奇数"的个数 分析 典型的数位dp问题 我们设置dp数组时可以根据 dp[pos][p ...

  7. HDOJ 3709 Balanced Number

    数位DP... Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java ...

  8. HDU 3555 Bomb(数位DP模板啊两种形式)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 Problem Description The counter-terrorists found ...

  9. HDU 6156 Palindrome Function 数位DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6156 题目描述: 求L~R所有的数的l~r进制的f(x), f(x) = 当前进制 如果回文串, f ...

最新文章

  1. python切片语法-Python字符串切片操作知识详解
  2. 【机器学习基础】机器学习算法中分类知识总结!
  3. 拿什么保护你,我的区块链
  4. 宿舍管理系统设计分析图
  5. java jsonarray 追加_我们如何在Java中将JSONArray添加到JSONObject?
  6. Comet OJ - 2019 六一欢乐赛
  7. java的栈堆的理解_理解堆与栈 - 一步一个脚印 - BlogJava
  8. python3的idle打不开_python3.4idle为什么打不开
  9. VSCode 如何支持 Flow
  10. 计算机网络系统由什么系统组成,从资源构成上看计算机网络系统由什么构成
  11. openstack 开发_2016年OpenStack开发板工作清单
  12. vant 日历插件slots_vue的vant组件库中的slot如何按需使用呢
  13. Google 将于明年彻底关闭 Chrome Apps,以后就是 PWA 的天下了
  14. 基础设置---python库--matplotlib
  15. c语言技术课第一次作业
  16. 内存测试软件 ddr4,DDR4内存芯片测试工具;DDR4内存检测仪
  17. 实验三 数字加法器的设计【Verilog】
  18. 面试:JavaScript基础概念
  19. Mac软件序列号查询工具:KCNScrew for mac
  20. 谷歌账号被封怎么办?谷歌账号解封申诉步骤请收好!

热门文章

  1. MySQL高级 - 锁 - InnoDB行锁 - 基本演示
  2. MySQL高级 trace工具
  3. 使用Docker-容器命令案例1
  4. 基于Xml 的IOC 容器-分配路径处理策略
  5. request对象简介和获取客户机信息
  6. RocketMQ的Producer详解之分布式事务消息(代码实现以及过程分析)
  7. 前端框架:执行流程分析之路由与菜单
  8. 3 ie兼容 vue_前端开发:MVVM框架之Vue势必会取代JQuery吗?
  9. python抓取网站访客手机号_点击了一个教育网站,马上就有老师打电话过来,他们是怎么获取我的手机号?...
  10. linux 基本指令