기존 방식의 경우, i-1, j-1 등의 값에 i==1 or j==1 인 경우, 인덱스가 0으로 유효하지 않은 값이 조회될 우려가 있기 때문에, 총 4가지의 케이스로 나누어 코드를 작성하였다. 하지만, i== 0, j==0 일 때를 각각 무한대값으로 초기화를 한다면 비교시에 해당 값이 최소값으로 뽑힐 염려가 없으므로, 2개의 경우로만 나누어서 코드를 작성할 수 있게 된다.
하지만 자바에서는 int 형에 무한대값을 적용할 수 없으므로, 가장 최대값인 Integer.MAX_VALUE 를 선언하였다.
packagepractice.algorithm.dp;publicclassMinimumSumPathBottomUpTrick {privatestaticfinalint N =4;privatestaticfinalint[][] m = { {0,0,0,0,0}, {0,6,7,12,5}, {0,5,3,11,18}, {0,7,17,3,3}, {0,8,10,14,9} };privatestaticfinalint[][] l =newint[N+1][N+1];publicstaticvoidmain(String[] args) {initializeL();System.out.println(findMinimumPath()); }privatestaticvoidinitializeL() {for (int i =0; i < N+1; i++) {for (int j =0; j < N+1; j++) {if (i ==0|| j ==0) { l[i][j] =Integer.MAX_VALUE; } } } }privatestaticintfindMinimumPath() {for (int i =1; i <= N; i++) {for (int j =1; j <= N; j++) {if (i ==1&& j ==1) { l[i][j] = m[i][j]; } else { l[i][j] =Math.min(l[i-1][j], l[i][j-1]) + m[i][j]; } } }return l[N][N]; }}
경로 출력하기
위에서 구한 값들은 목적지까지 도달하는데, 각 방문 칸들의 합을 최소로 하는 경로에서의 최소값을 구한 것이다. 만약 경로 그 자체를 출력하고자 한다면, 추가로 경로 배열을 하나 만들어서 출력해줄 수 있다.