CF2B题解
题意:
给你一个地图,只能往下走或往右走,问走的整个道路经过所有点的乘积末尾 \(0\) 的最少个数。
考虑 DP。
因为末尾 \(0\) 的个数等于这条路上 \(2\) 的个数与 \(5\) 的个数的最小值,所以我们维护两个 DP 数组, \(f_{i,j}\) 存储从 \((1,1)\) 点走到 \((i,j)\) 点最少的 \(2\) 数量,\(g_{i,j}\) 存储从 \((1,1)\) 点走到 \((i,j)\) 点最少的 \(5\) 数量。
则从 \((1,1)\) 点走到 \((i,j)\) 点最少的末尾 \(0\) 数量就是 \(\min\{f_{i,j},g_{i,j}\}\) 了。转移方程显然是 \(f_{i,j}=\min\{f_{i-1,j},f_{i,j-1}\}+num_{i,j,2}\) ,其中 \(num_{i,j,2}\) 指当前点的数字有几个约数 \(2\) 。同样的可以写出 \(g_{i,j}=\min\{g_{i-1,j},g_{i,j-1}\}+num_{i,j,5}\) 。
如果地图中有 \(0\) ,那就比较一下算出来的答案和 \(1\) 的大小关系。如果大于 \(1\) ,就选择走经过 \(0\) 的那条路。最后输出路径的话 DFS 倒着跑一遍即可。