设 f[i] 表示打印出 i 个 A 的最少操作次数。由于我们只能使用「复制全部」和「粘贴」两种操作,那么要想得到 i 个 A,我们必须首先拥有 j 个 A,使用一次「复制全部」操作,再使用若干次「粘贴」操作得到 i 个 A。
因此,这里的 j 必须是 i 的因数,「粘贴」操作的使用次数即为
。我们可以枚举 j进行状态转移,这样就可以得到状态转移方程:
当 j | i 时, f[i] = min {f[j] + i/j }
动态规划的边界条件为 f[1] = 0,最终的答案即为 f[n]。
var minSteps = function(n) {
var f = new Array(n + 1).fill(0);
for (var i = 2; i <= n; i++) {
f[i] = Number.MAX_VALUE;
for (var j = 1; j * j <= i; j++) {
if (i % j === 0) {
f[i] = Math.min(f[i], Math.floor(f[j] + i / j));
f[i] = Math.min(f[i], Math.floor(f[i / j] + j));
}
}
}
return f[n];
};