여기에 원래 제목 링크 : 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]를] > 8 - -> 7 경로 9, 최대 황금 도착.
예 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 > 2 -> 3 -> 4 -> 5 -> 6 -> 7.
제약 :
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 *를하지 않음). m = grid.length. N = 그리드 [0] .length.
AC 자바 :
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 의 경우 (표 == 널 || grid.length == 0 || 격자 [0] .length == 0 ) { 9 복귀 0 ; 10 } 11 12 INT의 입술 = 0 ; 13 이.grid = 격자; (14) 이 하는 .m = grid.length; 15 이 .N = 그리드 [0 ] .length; (16) 에 대한이 ( int로 I = 0; I <m은, 내가 ++ ) { 17 대 ( INT의 J = 0; N J <; J ++ ) { 18 INT 합 = DFS (I, J, 0 ); 19 입술 = Math.max (입술, 합); 20 } 21 } 22 23 복귀 입술; 24 } 25 26 개인 INT DFS ( INTI, INT의 J, INT의 합) { 27 일 경우 는 (i <0 || 난> = m의 || j를 <0 || J> = N || 격자 [I] [J] == 0 ) { 28 반환 합; 29 } 30 31 32 합계 + = 그리드 [I] [J] 33 INT의 온도 = 그리드 [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 (최대, DFS (X, Y, 합)); 42 } 43 44 표 [I] [J] = 온도; 45 리턴 최대; 46 } 47 }