数位DP实现Go语言版

数位是指把一个数字按照个、十、百、千等等一位一位地拆开,关注它每一位上的数字。如果拆的是十进制数,那么每一位数字都是 0~9,其他进制可类比十进制。

数位 DP:用来解决一类特定问题,这种问题比较好辨认,一般具有这几个特征:

  • 要求统计满足一定条件的数的数量(即,最终目的为计数);
  • 这些条件经过转化后可以使用「数位」的思想去理解和判断;
  • 输入会提供一个数字区间(有时也只提供上界)来作为统计的限制;
  • 上界很大(比如 10^{18}),暴力枚举验证会超时。

数位 DP 的基本原理:

数字计数

https://www.luogu.com.cn/problem/P2602

统计强大整数的数目

https://leetcode.cn/problems/count-the-number-of-powerful-integers/description/

三个整数 startfinishlimit,一个下标从 0 开始的字符串 s ,表示一个 正 整数。如果一个 正 整数 x 末尾部分是 s (换句话说,s 是 x 的 后缀),且 x 中的每个数位至多是 limit ,那么我们称 x 是 强大的 。请你返回区间 [start..finish] 内强大整数的 总数目 。

输入:start = 1, finish = 6000, limit = 4, s = “124”
输出:5
解释:区间 [1..6000] 内的强大数字为 124 ,1124 ,2124 ,3124 和 4124 。这些整数的各个数位都 <= 4 且 “124” 是它们的后缀。注意 5124 不是强大整数,因为第一个数位 5 大于 4 。
这个区间内总共只有这 5 个强大整数。

作者

JIeJaitt

发布于

2025-04-10

更新于

2025-04-10

许可协议

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×