완전탐색, 상향식 top-down
기준 위치에서 다음으로 넘어갈 때 오른쪽 아래, 왼쪽 아래 중 선택
가장 마지막까지 선택했을 때 더 큰 값을 갖는 것을 그 앞의 호출로 리턴
마지막 층에서부터 리턴 결과가 올라옴
public class NUM43105 {
public static void main(String[] args) {
int[][] triangle = {{7}, {3, 8}, {8, 1, 0}, {2, 7, 4, 4}, {4, 5, 2, 6, 5}};
System.out.println(solution(triangle));
}
public static int solution(int[][] triangle) {
int answer = 0;
answer = chooseNext(triangle, 0, 0, 0);
return answer;
}
public static int chooseNext(int[][] triangle, int row, int col, int sum) {
int num = triangle[row][col];
sum += num;
if(row >= triangle.length-1) {
return sum;
}
return Math.max(chooseNext(triangle, row+1, col, sum), chooseNext(triangle, row+1, col+1, sum) );
}
}
형제 노드에서 아래 노드로 이동할 때 같은 노드를 선택할 수 있다
연산 결과를 저장해둔다면 같은 노드를 선택하는 경우에 대해서 한 번만 연산하면 된다
동적계획법, 하향식 bottom-up
위에서부터 내려가면서 해를 저장해나감
public class NUM43105 {
public static void main(String[] args) {
int[][] triangle = {{7}, {3, 8}, {8, 1, 0}, {2, 7, 4, 4}, {4, 5, 2, 6, 5}};
System.out.println(solution(triangle));
}
public static int solution(int[][] triangle) {
int answer = 0;
for(int r = 1; r < triangle.length; r++) {
for(int c = 0; c < triangle[r].length; c++) {
if(c == 0) triangle[r][c] += triangle[r-1][c];
else if (c == triangle[r].length-1) triangle[r][c] += triangle[r-1][c-1];
else triangle[r][c] += Math.max(triangle[r-1][c-1], triangle[r-1][c]);
}
}
for(int c = 0; c < triangle[triangle.length - 1].length; c++) {
if(triangle[triangle.length-1][c] >= answer) answer = triangle[triangle.length-1][c];
}
return answer;
}
*다른 분들의 코드를 참고하여 작성했습니다