1. 程式人生 > >650. 只有兩個鍵的鍵盤

650. 只有兩個鍵的鍵盤

copy ++ ret 說明 次數 輸出 部分 new pub

最初在一個記事本上只有一個字符 ‘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 }

650. 只有兩個鍵的鍵盤