字符串复制
dfs:
//通过搜索dfs
static int res=Integer.MAX_VALUE;
public static int minStep(int n){
dfs(n,0);
return res;
}
public static void dfs(int n,int step){
if(n==1){
res=Math.min(res,step);
return;
}
if(n<=0||step>=res){
return;
}
for(int j=1;j*j<=n;j++){
if(n%j==0){
dfs(j,step+n/j);
dfs(n/j,step+j);
}
}
}
dp
//通过dp
public int minsteps(int n){
int[] dp=new int[n+1];
//dp[i]表示i个a最少操作次数
dp[1]=0;
//对于状态dp[i]从对应的i的因数转移过来 dp[i/j]
//如果对应的i/j是i的因数 对应的j也是因数
for(int i=2;i<=n;i++){
//取最大值
dp[i]=Integer.MAX_VALUE;
for(int j=1;j<=i/j;j++){
if(i%j==0){
dp[i]=Math.min(dp[i],dp[j]+i/j);
dp[i]=Math.min(dp[i],dp[i/j]+j);
}
}
}
return dp[n];
}
因数分解
//通过质因数分解方式
public int minSteps(int n){
int res=0;
for(int i=2;i<=n/i;i++){
while(n%i==0){
res+=i;
n/=i;
}
}
if(n>1){
res+=n;
}
return res;
}