数位DP (基础) HDU2089


数位dp就是先通过一些预处理,通过递推的方式得到数据,然后再进行计算

求[n, m]就是通过[0, m] - [0, n)来获得的。


不过我下面的代码我有一个疑问的地方

TAT如何判断cal函数计算的是开区间还是闭区间啊。

后来百度了一下,看到某位同志和我有一样的疑问http://tieba.baidu.com/p/4157853788,然后某位大牛给了很好的解答。

大牛是这么说的:

  • 因为f[i][j]表示第i位以j为开头的数的个数,而你在cal里面j只是从0遍历到dig[i]-1,比如cal(123)=f[3][0] + (f[2][0]+f[2][1]) + (f[1][0]+f[1][1]+f[1][2]) ,这样少加了第一位以3为开头的数123,也就是f[1][3],所以这里的cal(n)求的是[0,n-1]中符合条件的数的个数

仔细想了想,获得比5小的数,那么就是0,1,2,3,4,也就是把前面的这些加起来就可以了。但是,这道题目所求的是包括自己本身的,也就是说,题目的意思是获得小于等于5的数字,那么就是要将0,1,2,3,4,5,全部都算进去。所以就是cal(m + 1) - cal(n),而不是cal(m) - cal(n - 1)了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值