leetcode 650. 只有兩個鍵的鍵盤

題目描述:spa

最初在一個記事本上只有一個字符 'A'。你每次能夠對這個記事本進行兩種操做:code

Copy All (複製所有) : 你能夠複製這個記事本中的全部字符(部分的複製是不容許的)。
Paste (粘貼) : 你能夠粘貼你上一次複製的字符。
給定一個數字 n 。你須要使用最少的操做次數,在記事本中打印出剛好 n 個 'A'。輸出可以打印出 n 個 'A' 的最少操做次數。blog

示例 1:io

輸入: 3
輸出: 3
解釋:
最初, 咱們只有一個字符 'A'。
第 1 步, 咱們使用 Copy All 操做。
第 2 步, 咱們使用 Paste 操做來得到 'AA'。
第 3 步, 咱們使用 Paste 操做來得到 'AAA'。
說明:ast

n 的取值範圍是 [1, 1000] 。class

 

思路分析:遍歷

因爲每次都只能複製所有字符。這實際考察每一個數能夠由哪些因子組成。遍歷一次,對於每一個數選擇其可組成的因子對應複製次數最少的便可。具體看代碼di

 

代碼:co

 1 class Solution {
 2 public:
 3     void set_val(vector<int>&dp, int x)
 4     {
 5         for(int i=2; i<=sqrt(x); i++)
 6         {
 7             if(x%i==0)
 8             {
 9                 dp[x] = min(min(dp[x], dp[i]+(x-i)/i+1), dp[x/i]+(x-x/i)/(x/i)+1);
10             }
11         }
12     }
13     int minSteps(int n) {
14         if(n <= 1)
15             return 0;
16         vector<int> dp(n+1, 0);
17         for(int i=2; i<=n; i++)
18             dp[i]=i;
19         for(int i=3; i<=n; i++)
20         {
21             set_val(dp, i);
22         }
23         return dp[n];
24     }
25 };
相關文章
相關標籤/搜索