一些对数位dp的理解

对数位dp的一些理解

在解决统计区间内符合某些特征的数字的个数这类问题时,容易想到的做法是枚举这段区间,查找符合条件的数字,但当区间范围巨大或面临多次查询问题时,就会超时。


数位dp则很好的解决了遍历每一个数所造成的巨大时间开销,仅需要知道当前位的数字,以及对某位选择该数字与不选该数字两者之间的递推关系,即可在极短的时间内求出符合特征的数字数量。

  • 状态转移式子如下

    \[dp(i, limit \And (x = p_{i-1}), x) = dp(i, limit \And (x = p_{i-1}), x) + dp(i - 1, limit, last) \]

  • 当第 \(i\) 位之前的数不为上限时,\(dp(i, 0, last)\) 可以通过 \(dp(i - 1, 0, last)\) 进行状态转移。反之,第 \(i\) 位之前的数为上限时,\(dp(i, 1, last)\) 可以通过 \(dp(i - 1, 1, last)\)\(dp(i - 1, 0, last)\) 进行状态转移。这里的 \(last\) 表示上一个数字, \(limit\) 表示当前位是否为上限, \(x\) 表示当前位的数字。 如果前面所有数字都到达上限,则当前位的最大值为给定数同位的值,反之则为9。其时间复杂度为 \(O(len \cdot 10 \cdot 10)\) len 为数字的位数,\(10\) 为数字的范围,\(10\) 为上一个数字的范围。

例题:洛谷 P2657 [SCOI2009] windy 数

例题:洛谷 P4127 [AHOI2009] 同类分布

posted @ 2025-05-20 23:23  Foracy  阅读(13)  评论(0)    收藏  举报