0

オイラー問題n°15の解決策を見つけようとしています。 http://projecteuler.net/problem=15 (グリッドの左上隅から右下隅までのパスの数を見つけます)。

最初の試行は成功しませんでした。考えられるすべての組み合わせをリストに保存したため、ヒープの問題が発生しました (予測可能ですね)。

2 回目の試行では、グリッド内のすべてのポイントに存在する可能性のあるウェイの数を数えることにしました。たとえば、(0,0) にはアクセスする唯一の方法があり、(1,1) には ((0,1) 経由と (1,0) 経由の) 2 つのアクセス方法があります。すべてのポイントについて、前の 2 つのポイントの可能な方法を合計します。これはメモリの問題があまりない素晴らしい解決策のように見えたので、まだ正しい答えが得られません。間違いの原因のヒントを教えてください (明らかに間違いではなく、間違いを犯したと思います)。

盗まれたソースコード:

    @Test
public void testFoo() {
    long[][] grid = new long[20][20];
    for(int i=0; i<20; i++){
        grid[0][i]=1;
        grid[i][0] =1;
    }
    int steps=1;
    while(steps<21){
        for(int i=steps; i<20; i++){
            grid[i][steps]= grid[i-1][steps]+grid[i][steps-1];
            grid[steps][i]= grid[i-1][steps]+grid[i][steps-1];
        }
        steps++;
    }
    System.out.println(grid[19][19]); //35345263800
}
4

1 に答える 1

3

2 × 2グリッドには交点があるため、配列3 × 3が必要です。3 × 3

  0 1 2
0 ┌─┬─┐
1 ├─┼─┤
2 └─┴─┘

したがって、20 × 20グリッドの場合は21 × 21配列が必要です。


別の解決策: 数学で組み合わせを使用すると、答えは組み合わせ 40 20です。

于 2013-08-14T12:51:10.957 に答える