只有两个键的键盘 -- 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;
        } 

    }
};

  


posted @ 2021-09-21 23:25  荣荣荣荣荣荣  阅读(74)  评论(0)    收藏  举报