650. 只有兩個鍵的鍵盤
阿新 • • 發佈:2018-12-08
copy ++ ret 說明 次數 輸出 部分 new pub
最初在一個記事本上只有一個字符 ‘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] 。
盡可能的粘貼多的字符是本題的關鍵。先求出最大的可以組合的部分,然後在進行粘貼。因此就需要對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 intsum=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. 只有兩個鍵的鍵盤