5.数位统计DP
AcWing 338. 计数问题
实现思路:
定义函数:
count(n,x)
,其表示在1
到n
中,x
出现的次数(x
是0-9)那么,可以用类似前缀和的思想,来求解
a
到b
中,x
出现的次数:count(b,x) - count(a-1,x)
以
x = 1
为例,如何计算count(n, 1)
:分情况讨论。比如n
是个7位的数字abcdefg
,我们可以分别求出1
在每一位上出现的次数,然后做一个累加即可。比如求1
在第4
位上出现的次数,求有多少个形如xxx1yyy
的数在1
到abcdefg
之间。分两种大情况- xxx = 000 ~ abc - 1, 中间d=1,yyy = 000 ~ 999,一共有abc * 1000(即左右两边数的大小相乘)种选法
- 若xxx = abc
- d < 1,abc1yyy > adc0efg,超出n的范围,0种
- d = 1,yyy = 000 ~ efg,efg + 1种
- d > 1,yyy = 000 ~ 999,1000种
把上面全部的情况,累加起来,就是1出现在第四位的次数。
类似的,可以求解出1在任意一个位置上出现的次数,累加起来,就求出了1在每一位上出现的此时,即求解出了
count(n,1)
。注意:当
x=0
时,不能有前导0,所以当x=0
时,形如xxx0yyy
,前面的xxx
是从001(不能从00开始,左边选法相比不是0的情况就少了一次)
到999
1 |
|