728x90
문제
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
위 그림은 크기가 5인 정수 삼각형의 한 모습이다.
맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.
삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.
입력
첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고,
둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.
출력
첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다.
알고리즘 분류
- 다이나믹 프로그래밍
나의 풀이
- Top-down 방식 사용
package level15_dynamicProgramming;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 백준 1932번 문제] 정수 삼각형
public class Baekjoon1932 {
static int n; // 크기 n의 삼각형형
static int[][] arr;
static Integer[][] dp;
public static void main(String[] args) throws IOException {
// 입력 start
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
n = Integer.parseInt(br.readLine());
arr = new int[n][n];
dp = new Integer[n][n];
for(int i=0; i<n; i++) {
st = new StringTokenizer(br.readLine());
for(int j=0; j<i+1; j++) { // 행의 인덱스의 +1만큼의 요소 입력
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
// 입력 end
// 가장 마지막 행의 값들을 DP에 저장
for (int i=0; i<n; i++) {
dp[n-1][i] = arr[n-1][i];
}
System.out.println(dp(0, 0));
} //main end
public static int dp(int r, int c) { // 행, 열
if(r == (n - 1)) return dp[r][c]; // 저장 되어 있는 마지막행 dp 값들은 바로 반환
if(dp[r][c] == null) {
dp[r][c] = arr[r][c] + Math.max(dp(r+1, c), dp(r+1,c+1));
}
return dp[r][c];
}
}
결과
728x90
반응형