650. 只有两个键的键盘

141 阅读1分钟

650. 只有两个键的键盘

f[i] 表示打印出 iA 的最少操作次数。由于我们只能使用「复制全部」和「粘贴」两种操作,那么要想得到 iA,我们必须首先拥有 jA,使用一次「复制全部」操作,再使用若干次「粘贴」操作得到 iA

因此,这里的 j 必须是 i 的因数,「粘贴」操作的使用次数即为 ij1\dfrac{i}{j} - 1 。我们可以枚举 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];
};