代码改变世界

650. 只有两个键的键盘

2018-12-08 11:32  YihangZhou  阅读(154)  评论(0编辑  收藏  举报

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

  1. Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的)。
  2. Paste (粘贴) : 你可以粘贴你上一次复制的字符。

给定一个数字 n 。你需要使用最少的操作次数,在记事本中打印出恰好 n 个 'A'。输出能够打印出 n 个 'A' 的最少操作次数。

示例 1:

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

说明:

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

尽可能的粘贴多的字符是本题的关键。先求出最大的可以组合的部分,然后在进行粘贴。因此就需要对n做整除运算。若n = a * b;则有状态转移方程dp[n] = dp[max(a,b)] + min(a,b);其中dp[max(a,b)]表示组合成max(a,b)所需要的操作数,min(a,b)表示需要进行的操作数(复制一次 + 粘贴min(a,b)-1次)

 

 1 class Solution {
 2     public int minSteps(int n) {
 3         if(n==1)return 0;
 4         int sum=0;
 5         int[] dp=new int[n+1];
 6         for(int num=1;num<=n;num++){
 7             dp[num]=num;
 8             int i=(int)(Math.sqrt(num));
 9             for(;i>=1;i--){
10                 if(num%i==0){
11                     int temp=dp[num/i]+i;               
12                     if(temp<dp[num]){
13                         dp[num]=temp;
14                     }
15                 }
16             }
17         }
18         return dp[n];
19         
20     }
21 }