只有两个键的键盘 -- LeetCode -- 9.19
只有两个键的键盘
最初记事本上只有一个字符 'A'
。你每次可以对这个记事本进行两种操作:
Copy All
(复制全部):复制这个记事本中的所有字符(不允许仅复制部分字符)。Paste
(粘贴):粘贴 上一次 复制的字符。
给你一个数字 n
,你需要使用最少的操作次数,在记事本上输出 恰好 n
个 'A'
。返回能够打印出 n
个 'A'
的最少操作次数。
示例 1:
输入:3 输出:3 解释: 最初, 只有一个字符 'A'。 第 1 步, 使用 Copy All 操作。 第 2 步, 使用 Paste 操作来获得 'AA'。 第 3 步, 使用 Paste 操作来获得 'AAA'。
dfs:
设置变量 cnt 为操作次数, x 为当前 A 的数量,k 为当前可以通过 粘贴得到 A 的数量, n 为目标数量;
cnt 的每一次增加只伴随着两种效果:
① k = x,Copy All,一定要在 k != x 的情况下!
② x = x + k,Paste;
class Solution { public: int ans = 99999, flag = 0; void dfs(int cnt,int x,int k,int n){ if(flag == 1)return;//flag 剪枝 if(x > n)return; if(x == n){ ans = cnt; flag = 1; return; } if(k != x){ dfs(cnt + 1, x, x, n); } dfs(cnt + 1, x + k, k, n); } int minSteps(int n) { if(n == 1) return 0; else{ dfs(1,1,1,n); return ans; } } };