HDU - 3709 Balanced Number(数位dp)
题目链接:点击查看
题目大意:将一串数字视为天平,两端平衡的数字称为平衡数,并求出一段闭区间中平衡数的个数。所谓的平衡条件即为力臂与
力相乘后两端的数量和可以抵消,例如数字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)相关推荐
- HDU 3709 Balanced Number (数位DP)
题意 求出[x, y] 范围内的平衡数,平衡数定义为:以数中某个位为轴心,两边的数的偏移量为矩,数位权重,使得整个数平衡. 思路 外层枚举平衡点,然后数位DP即可.设计状态: dp[pos][o][l ...
- HDU 3709 Balanced Number(数位DP)题解
思路: 之前想直接开左右两边的数结果爆内存... 枚举每次pivot的位置,然后数位DP,如果sum<0返回0,因为已经小于零说明已经到了pivot右边,继续dfs只会越来越小,且dp数组会炸 ...
- HDU 3709 Balanced Number
Balanced Number 题意: 平衡数:存在该数中以一个数字为支点(pivot),点的"力矩"为该点到支点的距离乘以该点的值,而平衡指的是支点两侧的力矩和相等 思路: 易知 ...
- HDU - 3709 (Balanced Number)
题意:设一个数的十进制表达是 a1a2a3...an ,则它是 Balanced Number 的定义是:存在一个位置 i <=n,使得: 问区间[l,r] 内有多少个数是 Balanced ...
- HDU 5787 wolf Number 数位dp
题意 题目就是说让我们在l到r的数字中求得有多少个连续k为不相同的数 1≤L≤R≤1e18 2≤K≤5 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- HDU odd-even number 数位dp
题意 在l到r区间内求有多少个符合条件"当前数中所有连续的奇数长度是偶数 所有连续的偶数长度是奇数"的个数 分析 典型的数位dp问题 我们设置dp数组时可以根据 dp[pos][p ...
- HDOJ 3709 Balanced Number
数位DP... Balanced Number Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java ...
- HDU 3555 Bomb(数位DP模板啊两种形式)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 Problem Description The counter-terrorists found ...
- HDU 6156 Palindrome Function 数位DP
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6156 题目描述: 求L~R所有的数的l~r进制的f(x), f(x) = 当前进制 如果回文串, f ...
最新文章
- python切片语法-Python字符串切片操作知识详解
- 【机器学习基础】机器学习算法中分类知识总结!
- 拿什么保护你,我的区块链
- 宿舍管理系统设计分析图
- java jsonarray 追加_我们如何在Java中将JSONArray添加到JSONObject?
- Comet OJ - 2019 六一欢乐赛
- java的栈堆的理解_理解堆与栈 - 一步一个脚印 - BlogJava
- python3的idle打不开_python3.4idle为什么打不开
- VSCode 如何支持 Flow
- 计算机网络系统由什么系统组成,从资源构成上看计算机网络系统由什么构成
- openstack 开发_2016年OpenStack开发板工作清单
- vant 日历插件slots_vue的vant组件库中的slot如何按需使用呢
- Google 将于明年彻底关闭 Chrome Apps,以后就是 PWA 的天下了
- 基础设置---python库--matplotlib
- c语言技术课第一次作业
- 内存测试软件 ddr4,DDR4内存芯片测试工具;DDR4内存检测仪
- 实验三 数字加法器的设计【Verilog】
- 面试:JavaScript基础概念
- Mac软件序列号查询工具:KCNScrew for mac
- 谷歌账号被封怎么办?谷歌账号解封申诉步骤请收好!
热门文章
- MySQL高级 - 锁 - InnoDB行锁 - 基本演示
- MySQL高级 trace工具
- 使用Docker-容器命令案例1
- 基于Xml 的IOC 容器-分配路径处理策略
- request对象简介和获取客户机信息
- RocketMQ的Producer详解之分布式事务消息(代码实现以及过程分析)
- 前端框架:执行流程分析之路由与菜单
- 3 ie兼容 vue_前端开发:MVVM框架之Vue势必会取代JQuery吗?
- python抓取网站访客手机号_点击了一个教育网站,马上就有老师打电话过来,他们是怎么获取我的手机号?...
- linux 基本指令