LeetCode 650. 2 Keys Keyboard--动态规划

来源:互联网 发布:索尼卖大楼知乎 编辑:程序博客网 时间:2024/05/20 04:14

题目链接

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: 3Output: 3Explanation: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'.

解:

dp[i]表示得到i个'A'需要的最少step数,dp[1] = 0,对于dp[i],他可以由每个能整除i的数j(j > 1),通过对dp[i/j]做1次Copy All和j-1次Paste得到,而其中能使step最少的一定是所有j中最小的,比如我们想得到dp[24],

如果通过dp[2],step总数是2+12 = 14,

如果通过dp[3],step总数是3+8 = 11,

如果通过dp[4],step总数则4+6 = 10,

如果通过dp[6],step总数是5+4 = 9,

如果通过dp[8],step总数是6+3 = 9,

如果通过dp[12],step总数是7+2 = 9,

为了减少复杂度,遍历j的范围可以缩小到[2,n/2],代码:

class Solution {public:    int minSteps(int n) {        int *dp = new int[n+1];        if (n == 1) return 0;        for (int i = 2; i <= n; i++) {            dp[i] = i;            for (int j = 2; j < n/2+1; j++) {                if (i % j == 0 && (dp[i/j]+j) < dp[i]) {                      dp[i] = dp[i/j]+j;                      break;                }            }        }        return dp[n];    }};


原创粉丝点击