다음 내용은 다음과 같습니다
정수 사각형 격자 감안
arr
하는 영이 아닌 시프트 떨어지는 경로 의 각 행에서 정확히 하나의 원소를 선택arr
인접한 행 선택에는 두 가지 요소가 동일한 열에 없는지 등.비 제로의 변화와 떨어지는 경로의 최소 금액을 돌려줍니다.
예 1 :
입력 : 도착 = [1,2,3], [4,5,6], [7,8,9] 출력 : 13 : 설명 가능한 전도 경로는 : [1,5,9-] [1 , 5,7], [1,6,7], [1,6,8], [2,4,8], [2,4,9], [파 -2,6,7-] [2,6 8], [3,4,8], [3,4,9], [3,5,7], [3,5,9]가 최소 합과 하강 경로는 [1,5,7] 그래서 대답은 13입니다.제약 :
1 <= arr.length == arr[i].length <= 200
-99 <= arr[i][j] <= 99
솔루션의 개요 : DP [I] [j]가 i 번째 행 j 번째 요소는 0 ~ I 라인 간격으로 얻어진 최소 값을 취하고있다 함. 그러면 명확 DP [I] [J] = 분 (DP [I] [J], (DP) [I-1] [K] + 도착 [I] [J]), J! = K. 이 경우 시간 복잡도는 O (n)은 시간 제한이다. 모든 J에 대한 사실을 다시 생각해 상기 DP [I-1]만큼 물론 열과 J의 최소값이 동일하지 않을 수있는 등의 최소 값을 발견한다. DP 만 기록 할 필요가 [I-1]와 최소 시간 라인 최소값 및 인덱스 J의 최소값을 작은 값 또는 최소값으로 동일한 시간이 걸리는 경우.
다음과 같이 코드입니다 :
클래스 솔루션 (객체) DEF minFallingPathSum (자기, 도착) "" " : 타입 도착리스트 [리스트 [INT] : RTYPE : INT " "" DP = [플로트 ( " INF " )] * 렌 (도착 ) 용 _ 에 도착] 에 대한 I 의 범위 (LEN (도착)) DP [0] [I] = 도착 [0] [i]는 DEF getMin (도착) min_val = 플로트 ( " INF " ) min_inx = 0 에 대한 난 에서범위 (렌 (도착)) 경우 min_val> 도착 [I] : min_val = 도착 [I] min_inx = 나 리턴 (min_val, min_inx) DEF getSecMin (도착, min_inx) sec_min_val = 플로트 ( " INF " ) sec_min_inx = 0 위한 I 의 범위 (렌 (도착)) 경우 나 == min_inx : 계속할 경우 sec_min_val> 도착 [I] sec_min_val =도착 [I] sec_min_inx = 나 리턴 (sec_min_val, sec_min_inx)를 위한 I 의 범위 (1 : 렌 (도착)) min_val, min_inx = getMin (DP [I-1 ]) sec_min_val, sec_min_inx = getSecMin (DP [I-1 ] min_inx) 에 대한 J 의 범위 (LEN (도착)) 경우 J == min_inx : DP [I] [J] = 분 (DP [I] [J], (DP) [I-1] [sec_min_inx] + 도착 [I] [J]) 다른 : DP [I] [J]= 분 (DP [I] [J], DP [i가 1 - [min_inx] + 도착 [I] [J]) 리턴 분 (DP [-1])