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

本文探讨了如何使用两种不同的数位动态规划方法解决给定区间内平衡数的问题,涉及考虑前导0和不考虑前导0两种策略,通过实例代码展示了如何计算平衡数的个数。

题目链接:Problem - 3709

题意:给定区间[a,b],求区间内平衡数的个数。所谓平衡数即有一位做平衡点,左右两边数字的力矩相等。

分析,这道题我们直接对平衡点进行枚举即可,然后分别求出来每个平衡点对应的平衡数求和,最后即为答案。

需要注意的是前缀0的情况,对于000000000这样的答案我们实际上是不应该计入答案的,也就是说我们在数位DP的过程中需要考虑前导0,在pos=0最后返回的时候也要判断当前是否有前导0的存在,如果有前导0就直接返回0,否则返回当前平衡数左边和右边的力矩差与0判等的bool值。这里需要注意的一点是由于我们在数位DP中没有考虑前导0,但这会导致我们少考虑一个数,那就是0,所以如果l~r内包含0,我们还应该加上一个1,对应到代码中就是若x<0,则在solve函数中直接返回-1。

当然我们也可以在数位DP过程中不考虑前导0,而在最后统一减去前导0的贡献,也就是ans-pos+1

下面分别附上两种方法的代码:

数位DP过程中考虑前导0:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值