题目描述
https://leetcode-cn.com/problems/2-keys-keyboard/
解法
单纯知道是动态规划,很难去思考它的递推过程。于是去看题解:
我们就知道它是如何思考的,不同于四键键盘问题,四键键盘问题它的目标是求得最大的操作数,本质也是遍历所有可能情况的最大值,但是却很直观。这道题则比较绕,如果我们不知道可以分组思考的话,比较难做。
class Solution {
public int minSteps(int n) {
int []dp = new int[n+1];
dp[0] = 0;
dp[1] = 0;//1个字符本来就存在
for(int i=2;i<=n;i++){
dp[i] = i;//最坏的情况,这里加了下面j就从j=2起步
for(int j=2;j<=i/2;j++){//子区长度j为1的时候就是最坏情况。
if(i%j==0){//是其因数,即可以分区
dp[i] = Math.min(dp[i],dp[j]+i/j);
//dp【j】加cppp的操作,即第二组的长度
}
}
}
return dp[n];
}
}
时间复杂度为O(n2)
当然,如果从官方题解的角度,复杂度上还可以优化:
class Solution {
public int minSteps(int n) {
int ans = 0, d = 2;
while (n > 1) {//A个数
while (n % d == 0) {//可以划分,一个分区长度是d
ans += d;//长度就是操作数
n /= d;//切换到另一个分区,长度是n/d
}
d++;//然后在下一个分区里面再次分区,如果它不能分区,必然会走到d==n的情况,然后ans+d.
}
return ans;
}
}