题目:给定一个字母 A,已知你可以每次选择复制全部字符,或者粘贴之前复制的字符,求最少需
要几次操作可以把字符串延展到指定长度
输入是一个正整数,代表指定长度;输出是一个整数,表示最少操作次数。
C++题解:
总体思路:对每一个格子i(i个A),如果i可以被j除尽,说明j个A可以通过复制粘贴得到i个A,复制粘贴次数为i / j。
每个格子的意义:得到目前数量个A需要的最少操作次数
递推公式:dp[i] = min(dp[i], dp[j] + i / j),其中i % j == 0
初始化:1个A不需要操作,初始化为0
class Solution {
public:
int minSteps(int n) {
vector<int>dp(n+1,n+1);
dp[1]=0;
for(int i=2;i<=n;++i){
for(int j=1;j<=i/2;++j){
if(i%j==0){
dp[i]=min(dp[i],dp[j]+i/j);
}
}
}
return dp[n];
}
};