SPOJ中存在一个问题,我正在搜索其他额外输入以了解问题。我遇到了下面的代码,他们说他们使用了memozation。我无法理解Array的使用,有人可以解释一下代码吗?我想开发自己的逻辑并使用它。
import java.util.Scanner;
class Coins {
long r[] = new long[1000000];
public long Coin(long n) {
if (n == 0) {
return 0;
}
if (n < 12) {
return n;
}
if (n < 1000000) {
if (r[(int) n] > 0) {
return r[(int) n];
}
}
long m = Math.max(n, Coin(n / 2) + Coin(n / 3) + Coin(n / 4));
if (n < 1000000) {
r[(int) n] = m;
return m;
}
}
public static void main(String[] args) throws java.lang.Exception {
Scanner sc = new Scanner(System.in);
while (sc.hasNextLong()) {
long n = sc.nextLong();
Coins i = new Coins();
long r = i.Coin(n);
System.out.println(r);
}
}
}
答案 0 :(得分:0)
该阵列用作内部缓存。它缓冲< 1000000
的结果为&#34;小&#34; n
的输入(0 <= n < 12
)。如果多次使用相同的输入参数,这可以避免重新计算结果。
对于微小的值(n
),不需要复杂的计算,也不使用缓存。对于所有其他&#34;小&#34;值m
,如果缓存已包含结果,则检查缓存。已知零表示空/无效高速缓存条目。回想一下,Java初始化所有数组条目为零,if (n < 1000000) {
if (r[(int) n] > 0)
return r[(int) n];
}
也不能为零。因此,如果缓存中存在有效条目,则此值仅作为结果返回:
long m = ...
否则,计算返回值:n
。最后,对于if (n < 1000000)
r[(int) n] = m;
的小值,结果将另外缓存在缓存中。
{{1}}