HDU 3709 Balanced Number 求区间内的满足是否平衡的数量 (数位dp)
平衡数的定义是指,以某位作为支点,此位的左面(数字 * 距离)之和 与右边相等,距离是指某位到支点的距离;
题意:求区间内满足平衡数的数量 ;
分析:很好这又是常见的数位dp , 不过不同的是我们这次需要枚举是哪个位置是平衡点 , 一开始我是想说搜索到最后以为 ,然后得到这个数的位数 ,在判断平衡位置 , 想到这样的话 , 这就说明了我对数位dp 还是不太熟悉的 ,因为这样的话dfs() 里面的sum , emmm是找不到状态的 ;
正解: 依然是枚举平衡点的位置 ,这个思路没有问题 , 但是这个却是在so(_) 函数里面枚举 ,啊这样就妙不可言了, 这样的话只要我们在dfs()里面增加变量 k ,表示是平衡点的位置 , 那这样的话我的sum 就是记录 从左到右的贡献 , 因为是从左到右的枚举 , 左边加, 右边减 , 所以是不是sum<0 , 就肯定是不行的嘛 ;哦!还有一个重点 ,因为0也是平衡数来的 , 所以我们这样的枚举平衡点就加了ans-1 次0 的贡献 ,这里巨坑一开始没有想到,其他代码打出来了 , 答案不对 ,然后找程序的错误 ,其实这里是关键来的
#include<stdio.h>
#include<string.h>
#include<cmath>
using namespace std ;
#define ll long long
ll dp[][][];
ll a[];
ll dfs(int pos , int k , int sum , bool limit)
{
if(pos==-)
return sum==;
if(sum<)
return ;
if(!limit && dp[pos][k][sum]!=-)
return dp[pos][k][sum];
int up=limit?a[pos]:;
ll ans=;
for(int i= ; i<=up ; i++)
{
ans+=dfs(pos-,k,sum+(pos-k)*i,limit&&i==a[pos]);
}
if(!limit)
dp[pos][k][sum]=ans;
return ans;
}
ll so(ll x)
{
int ans=;
ll sum=;
while(x)
{
a[ans++]=x%;
x/=; }
for(ll i= ; i<ans ; i++)
sum+=dfs(ans-,i,,);
return sum-(ans-);
}
int main( )
{ int t;
memset(dp,-,sizeof(dp));
scanf("%d",&t);
while(t--)
{
ll l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",so(r)-so(l-));
}
}
HDU 3709 Balanced Number 求区间内的满足是否平衡的数量 (数位dp)的更多相关文章
- hdu 3709 Balanced Number(数位dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709 题意:给定区间[a,b],求区间内平衡数的个数.所谓平衡数即有一位做平衡点,左右两边数字的力矩相 ...
- HDU 3709 Balanced Number (数位DP)
Balanced Number Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- hdu 3709 Balanced Number(平衡数)--数位dp
Balanced Number Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- HDU 3709 Balanced Number (数位DP)
题意: 找出区间内平衡数的个数,所谓的平衡数,就是以这个数字的某一位为支点,另外两边的数字大小乘以力矩之和相等,即为平衡数. 思路: 一开始以为需要枚举位数,枚举前缀和,枚举后缀和,一旦枚举起来就会M ...
- HDU - 3709 - Balanced Number(数位DP)
链接: https://vjudge.net/problem/HDU-3709 题意: A balanced number is a non-negative integer that can be ...
- HDU 3709 Balanced Number
发现只要Σa[i]*i%Σa[i]==0就可以. #include<iostream> #include<cstdio> #include<cstring> #in ...
- HDU 3709 Balanced Number(数位DP)题解
思路: 之前想直接开左右两边的数结果爆内存... 枚举每次pivot的位置,然后数位DP,如果sum<0返回0,因为已经小于零说明已经到了pivot右边,继续dfs只会越来越小,且dp数组会炸 ...
- HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- hdu 4630 查询[L,R]区间内任意两个数的最大公约数
No Pain No Game Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
随机推荐
- 运行程序显示:Could not find version 8.3 of the MCR.
- php中COM函数的使用
php里的com类可以操作window系统上的东西 例如:可以在本地打开一个word文档,然后写入东西,只用于window系统 需要加载php_com_dotnet.dll模块 $word = n ...
- NULL、0、nullptr
C的NULL 在C语言中,我们使用NULL表示空指针,也就是我们可以写如下代码: int *i = NULL;foo_t *f = NULL; 实际上在C语言中,NULL通常被定义为如下: #defi ...
- 使用Javascript Ajax 通信操作JSON数据 [上]
以前只是知道json的格式而已,也做过的是从数据库获得数据然后弄成json的格式然后赋给HighCharts生成曲线,先把数据库的数据使用array()函数转换成数组,然后使用json_encode( ...
- SpringBoot12 QueryDSL02之利用QueryDSL实现多表关联查询
1 业务需求 有的系统业务逻辑比较复杂,存在着多表关联查询的的情况,查询的内容不仅仅是单张表的的内容而是多张表的字段组合而成的,直接使用SplringDataJPA实现是比较复杂的,但是如果使用Que ...
- 获取当前设备的CPU个数
public class Test { public static void main(String[] args) { //获取当前设备的CPU个数 int availableProcessors ...
- EZOJ #81
传送门 分析 每次拿a中最大的去匹配b中最小的 至于原因画个图感性思考一下就可以啦 代码 #include<iostream> #include<cstdio> #includ ...
- Spring学习大纲
1.BeanFactory 和 FactoryBean? 2.Spring IOC 的理解,其初始化过程? 3.BeanFactory 和 ApplicationContext? 4.Spring B ...
- Spring Bean的装配
Bean 的装配,即Bean对象的创建.容器根据代码要求创建Bean对象后再传递给代码的过程,称为Bean的装配. 一.默认分的装配方式 默认的装配的方式调用Bean类的构造方法 二.动态工厂Bean ...
- 【C#】 通过http webRequest方式调用webservice
上一篇文章写了关于webservice的调用部署等内容,在上一篇文章中,我们通过微软给的方式--添加[WebReference服务引用]来进行调用如下图 那今天,我们说的是通过webrequest的方 ...