我想更多地了解这部分代码的功能

时间:2015-09-22 13:14:39

标签: java

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);
         }
      }
   }

1 个答案:

答案 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}}