111test

发布时间 2023-08-21 21:27:18作者: Linxrain

基本解法

数位dp就是换一种暴力枚举的方式,使得新的枚举方式符合dp的性质,提前预处理好即可。

我们可以用$f(n)$表示$[0,n]$的所有满足条件的个数,那么求$[l,r]$的答案就可以用$f(r)-f(l-1)$得到,相当于前缀和思想。也就是说我们只需要求出$f(n)$即可。

那么数位dp的关键思想就是将数拆分成位,从高位到低位开始枚举。将$N$视为$n$位数,即拆分$N$为:$a_n、a_{n-1}...a_1$。

由于$f(n)$表示小于等于$N$的数满足条件的个数,所以枚举时若该位取$0 \sim a_{n-1}$时,后面位上无论取多少都不会超过$N$这个数。

便分为了两种情况的分支进行分类讨论,看似并没有减少时间复杂度,但是对于数位dp左边的分支往往可以预处理出来。预处理的方法具体由题目来定,有的时候需要dp,有的时候需要组合数学或其他方法,基本是可以在$O(1)$或常数复杂度范围内计算出来的。

采用记忆化搜索,预处理后左边分支便不用枚举下去,而右面分支由于顶限制的情况会比较少,复杂度在可承受的范围之内,只搜一次即可。