【发布时间】:2017-05-03 04:59:43
【问题描述】:
谜题是获得使数字为 1 所需的最少步数。允许的操作是
1. You can subtract 1 from the number
2. You can divide the number by 2 if it is divisible by 2.
3. You can divide the number by 3 if it is divisible by 3.
最后,您需要通过执行上述操作使数字为 1。我正在尝试获得一个解决方案,该解决方案为我提供了使数字为 1 所需的上述操作的最少数量。 我的代码(Java)如下。
public int minStepsBottomUp(int n) {
int[] memoArray = new int[n+1];
memoArray[0] = 0;
memoArray[1] = 0;
for(int i=2;i<=n;++i){
int r = 1 + memoArray[i-1];
if(n % 2 == 0) {
r = Math.min(r, 1+memoArray[n/2]);
}
if(n % 3 == 0) {
r = Math.min(r, 1+memoArray[n/3]);
}
memoArray[i] = r;
}
return memoArray[n];
}
但我得到了一些模棱两可的结果。例如 - 如果数字是 5,我得到所需的最小步数为 4。实际上应该是 3。有人可以解释我哪里出错了吗?
【问题讨论】:
-
如果它可以被 2 和 3 整除,例如 6,会发生什么?这些操作是否按优先顺序排列?
-
您应该拿起笔和纸,手动操作,并将您的手动步骤与您的算法进行比较。
-
3 与 5 的结果如何?
-
@Bruce Feldman 给出了正确的答案——您在原本出色的程序中出现了拼写错误。
n->i在各个地方。
标签: java algorithm dynamic-programming