CF2B-The-least-round-way-题解

原题链接:Link

题目描述

从左上走到右下,让经过数字乘积末尾的 0 个数最少。

思路分析

区间末尾的 0 是由质因数 2 和 5 产生的,容易想到把每个数有多少个 2 和 5 分别存下来。

接下来问题就产生了,我应该选择 2 比较少还是选择 5 比较少呢?

因为最后 10 的个数取决于这两个个数的最小值,所以其实没有必要兼顾,只要极力最小化某一个值就行。

具体的说,我们根据 5 的个数跑一次类似数字三角形, DP 求出最少的 5。(定义 \(f_{i,j}\) 表示走到 \((i,j)\) 的最少 5 个数,则 \(f_{i,j} = \min(f_{i - 1,j}, f_{i, j - 1}) + a_{i,j}\)

然后再跑一边 DP ,只不过这次是求 2。

最后比一下 5 和 2 谁少就行。(DP 转移的时候记录一下路径)

这样你就华丽丽地 \(\text{T}\) 了。

为啥捏?因为有 0。

在统计因数个数的时候,0 会直接死循环。而且,一旦乘了 0,末尾 0 个数一定是 1 个。

所以我们对 0 特判,先不走 0(把 0 的位置设为无穷大),如果答案比 1 小,那就走答案,否则走 0。注意 0 对应的路径也要特殊处理。

AC代码