题解:
class Solution {
public:
int minSteps(int n) {
//使用最少的操作次数 在记事本上输出恰好n个A
//动态规划 dp[i] = min{dp[j]+i/j} 意为i个A由j个A经过一次复制 若干粘贴得到 粘贴次数为i/j-1 再加上一次复制操作
//j为i的因数
vector<int> dp(n+1);
dp[1] = 0;
//计算dp
for(int i = 2;i<=n;i++){
dp[i] = INT_MAX;
for(int j = 1;j*j<=i;j++){
if(i%j == 0){
//j是i的因数
dp[i] = min(dp[i],dp[j]+i/j);
//看另一个因数是否能更小 减小时间复杂度
dp[i] = min(dp[i],dp[i/j]+j);
}
}
}
return dp[n];
}
};