ここでのオリジナルタイトルリンク:https://leetcode.com/problems/path-with-maximum-gold/
トピック:
金鉱では grid
サイズの m * n
、この鉱山内の各セルは、そのセル内の金の量を表す整数を有し 0
、それが空である場合。
あなたが条件の下で集めることができる金の最大量を返します:
- あなたがセル内に位置しているたびに、あなたはそのセル内のすべての金を収集します。
- あなたの位置からは、右、上または下、左に一歩を歩くことができます。
- あなたは、複数回同じセルを訪問することができません。
- 細胞訪問決して
0
金を。 - あなたは、起動して、いくつかの金を持っているグリッド内の任意の位置からの金の収集を停止することができます。
例1:
入力:グリッド= [0,6,0]、[5,8,7]、[0,9,0]] 出力:24 説明 :[[0,6,0]、 [5,8,7] 、 [0,9,0]] 最大金を得るためにパス、9 - > 7 - > 8。
例2:
入力:グリッド= [[1,0,7]、[2,0,6]、[3,4,5]、[0,3,0]、[9,0,20]] 出力:28 説明: [[1,0,7]、 [2,0,6]、 [3,4,5]、 [0,3,0]、 [9,0,20]] のパスを取得するための最大の金、1 - > 7 - > 2 - > 3 - > 4 - > 5 - > 6。
制約:
1 <= grid.length, grid[i].length <= 15
0 <= grid[i][j] <= 100
- 金を含む最大25個の細胞があります。
ソリューション:
グリッド内の各セルについて、DFSを開始します。
DFSの状態が現在のインデックスと現在の合計です。そして、それは現在のインデックス、それは得ることができる最大のglodから始まる返す必要があります。
現在のインデックスが不正な場合、現在の合計を返します。
それ以外の場合は、accumlateグリッド[i] [j]は合計します。そして、各方向のために、DFSを行います。4つの方向のうち最大値を取得し、返します。
復帰する前に、元の値にグリッド[i]の[j]をバックトラック。
時間計算:expontential。
スペース:O(M×n個)。M = grid.length。N =グリッド[0] .LENGTH。
ACのJava:
1 クラスソリューション{ 2 のint [] []グリッド。 3 int型M。 4 INT N。 5 INT [] [] DIRS = 新しい INT [] [] {{0、1}、{0、-1}、{-1、0}、{1,0 }}。 6 7 公共 INT getMaximumGold(INT [] []グリッド){ 8 であれば(グリッド== NULL || grid.length == 0 ||グリッド[0] .LENGTH == 0 ){ 9 戻り 0 ; 10 } 11 12 int型のRES = 0 。 13 本.grid = グリッド。 14 本 .M = grid.length。 15 この .N =グリッド[0 ] .LENGTH。 16 のためには、(int型 i = 0; iがm <; iは++ ){ 17 のための(int型 J = 0; nはJ <; J ++ ){ 18 INT和= DFS(I、J、0 ); 19の RES = Math.max(RES、合計)。 20 } 21 } 22の 23 戻りRES。 24 } 25の 26 プライベート INT DFS(INTI、int型 J、int型の合計){ 27 場合(I <0 || I> = M || J <0 || J> = N ||グリッド[I] [J] == 0 ){ 28 リターン和。 29 } 30 31 32 合計+ = グリッド[I] [J]。 33 INTの TEMP = グリッド[I] [J]。 34 グリッドは、[I] [J] = 0 。 35 36 のint最大= 0 。 37 のために(INT [] DIR:DIRS){ 38 、INT X = I + DIR [0 ]。 39 INTの Y = J + DIR [1 ]。 40 41 マックス= Math.max(MAX、DFS(X、Y、和))。 42 } 43 44 グリッド[I] [J] = TEMP。 45 リターン最大。 46 } 47 }