최대 골드와 LeetCode 1219 경로

여기에 원래 제목 링크 : 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 }

 

추천

출처www.cnblogs.com/Dylan-Java-NYC/p/11791324.html