Skip to the content.

leetcode [650] 只有两个键的键盘


Contact me:

Blog -> https://cugtyt.github.io/blog/index
Email -> cugtyt@qq.com
GitHub -> Cugtyt@GitHub


最初在一个记事本上只有一个字符 ‘A’。你每次可以对这个记事本进行两种操作:

Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的)。 Paste (粘贴) : 你可以粘贴你上一次复制的字符。 给定一个数字 n 。你需要使用最少的操作次数,在记事本中打印出恰好 n 个 ‘A’。输出能够打印出 n 个 ‘A’ 的最少操作次数。

示例 1:

输入: 3
输出: 3
解释:
最初, 我们只有一个字符 'A'。
第 1 步, 我们使用 Copy All 操作。
第 2 步, 我们使用 Paste 操作来获得 'AA'。
第 3 步, 我们使用 Paste 操作来获得 'AAA'。

说明:

n 的取值范围是 [1, 1000] 。

思路,动态规划,初始情况出现k个字符,最多需要K步。如果已知当前个数的步数,那么其倍数可以计算得到,如已知3需要的步数为3,那么6,9需要的步数相应为最多5,6,(复制需要占用一步)。

注意,计算9的时候不能直接用6的结果+1,因为可能6有其他解法,导致误以为只需要在6上加的3,应该计算9和3的距离得到。

class Solution:
    def minSteps(self, n: int) -> int:
        if n <= 1: return 0
        dp = [i for i in range(n + 1)]
        for i in range(2, n + 1):
            for j in range(i * 2, n + 1, i):
                dp[j] = min(dp[i] + (j - i) // i + 1, dp[j])
        return dp[-1]