Leetcode 650. 2 Keys Keyboard

650. 2 Keys Keyboard

Initially on a notepad only one character 'A' is present. You can perform two operations on this notepad for each step:

  1. Copy All: You can copy all the characters present on the notepad (partial copy is not allowed).
  2. Paste: You can paste the characters which are copied last time.

Given a number n. You have to get exactly n 'A' on the notepad by performing the minimum number of steps permitted. Output the minimum number of steps to get n 'A'.

Example 1:

Input: 3
Output: 3
Explanation:
Intitally, we have one character 'A'.
In step 1, we use Copy All operation.
In step 2, we use Paste operation to get 'AA'.
In step 3, we use Paste operation to get 'AAA'.

Note:

  1. The n will be in the range [1, 1000].

題目鏈接:https://leetcode.com/problems/2-keys-keyboard/description/

題目大意:記事本上最初有一個字母'A',給定兩種操作:(1)Copt All :複製記事本上所有 'A' ;(2)Paste : 粘貼複製的內容。求獲得 n 個 'A' 的最少操作步驟。

解題思路:動態規劃:如果 a 是 b 的倍數,可通過拷貝 b 得到 a,得到狀態轉移方程:dp[ (i-1)  * j ] = min ( dp[(i-1) * j ] , dp[ i-1 ] + j ) ; 其中,(i-1)  表示 (i-1) 個'A',dp[ i-1 ]表示獲得(i-1) 個'A' 的最少步驟,獲取 j 倍 ( i-1 ) 個  'A' 的步驟數可通過粘貼 j 次 ( i-1 ) 個  'A',步驟數就用 dp[i-1] + j 表示。

代碼:

class Solution {
public:
    int minSteps(int n) {
        int dp[1005];
        for(int i = 0;i < 1005;i ++){
            dp[i] = 1e8;
        }
        if (n == 1)
            return 0;
        if (n == 2)
            return 2;
        dp[1] = 0;
        dp[2] = 2;
        for(int i = 3;i <= n ;i ++){
            for(int j = 2;(i-1) * j <= n; j ++){
                dp[(i-1) * j] = min((i-1) * j , dp[i-1] + j);
            }
            if (dp[i] == 1e8){  // i 不是除了1和本身外的其他數字的倍數
                dp[i] = i;
            }
        }
        return dp[n];
    }
};



發佈了185 篇原創文章 · 獲贊 7 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章