题目:小明手中有个数字n,他有两种方法操作n。
第一种,使n-1,然后步数+x。
第二种,使n/k(满足n%k=0),然后步数+y。
给定一个数组,求出将n变成1最少需要多少步。
import java.util.HashMap;
import java.util.Map;
public class MinStepsToReduceNumber {
private Map<Long, Integer> memo = new HashMap<>();
public int minSteps(long n, int k, int x, int y) {
// 如果n已经是1,则不需要额外的步骤
if (n == 1) return 0;
// 如果之前已经计算过当前n对应的最小步数,则直接返回结果
if (memo.containsKey(n)) return memo.get(n);
// 计算减1操作后的步数
int result = x + minSteps(n - 1, k, x, y);
// 如果n可以被k整除,则考虑除以k的操作
if (n % k == 0) {
// 计算除以k操作后的步数
int divideResult = y + minSteps(n / k, k, x, y);
// 取两者中的较小值
result = Math.min(result, divideResult);
}
// 将计算结果存入map中
memo.put(n, result);
return result;
}
public static void main(String[] args) {
MinStepsToReduceNumber solver = new MinStepsToReduceNumber();
long n = 10; // 示例数字n
int k = 2; // 示例k值
int x = 1; // 减1操作的代价
int y = 3; // 除以k操作的代价
System.out.println("最少需要的步数是:" + solver.minSteps(n, k, x, y));
}
}