グリッド ウォーキング(スコア 50 ポイント): あなたは N 次元グリッドの位置 にい(x_1,x2,...,x_N)
ます。グリッドの寸法は(D_1,D_2,...D_N)
です。1 つのステップで、どのN
次元でも 1 歩進んだり後ろに歩いたりできます。(したがって、常に2N
異なる動きが可能です)。M
どの時点でもグリッドから離れないように、何通りの方法でステップを踏むことができますか? x_i
いずれかの場合は、グリッドを離れますx_i <= 0 or x_i > D_i
。
入力:
最初の行には、テスト ケースの数が含まれますT
。T
テストケースが続きます。各テスト ケースについて、最初の行には and が含まN
れM
、2 行目には が含まれx_1,x_2...,x_N
、3 行目には が含まれますD_1,D_2,...,D_N
。
したがって、上記のソリューションでは、1 次元配列を取得しようとしています。ウェブサイトは答えであると主張38753340
していますが、私はそれを得ていません.
public class GridWalking {
/**
* @param args
*/
public static void main(String[] args) {
try {
long arr[] = new long[78];
long pos = 44;
long totake = 287;
/*
* Double arr[] = new Double[3]; Double pos = 0; Double totake = 5;
*/
Double val = calculate(arr, pos, totake);
System.out.println(val % 1000000007);
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
}
public static HashMap<String, Double> calculated = new HashMap<String, Double>();
private static Double calculate(long[] arr, long pos, long totake) {
if (calculated.containsKey(pos + "" + totake)) {
return calculated.get(pos + "" + totake);
}
if (0 == totake) {
calculated.put(pos + "" + totake, new Double(1));
return new Double(1);
}
if (pos == arr.length - 1) {
Double b = calculate(arr, pos - 1, totake - 1);
Double ret = b;
calculated.put(pos + "" + totake, new Double(ret));
return ret;
}
if (pos == 0) {
Double b = calculate(arr, pos + 1, totake - 1);
Double ret = b;
calculated.put(pos + "" + totake, new Double(ret));
return ret;
}
Double a = calculate(arr, pos + 1, totake - 1);
Double b = calculate(arr, pos - 1, totake - 1);
Double ret = (a + b);
calculated.put(pos + "" + totake, ret);
return ret;
}
}