알고리즘/다이나믹프로그래밍
[백준] 1932. 정수 삼각형
leah-only
2025. 1. 31. 16:38
https://www.acmicpc.net/problem/1932
dp 문제 중 비교적 쉽게 풀어냈다.
아래 숫자에서 위의 숫자들 중 가장 큰 값을 가진 숫자를 더하는 식으로 dp 점화식을 세웠다.
- 맨 왼쪽 또는 오른쪽에 위치한 숫자들은 대각선에 있는 숫자 하나를 선택할 수 있다.
- 그 외에는 두 숫자 중 큰 값을 선택해 더한다.
따라서
j == 0 일 때는 dp[i-1][j] + arr[i][j]
j == cnt -1 일 때는 dp[i-1][j-1] + arr[i][j]
그 외에는 Math.max(dp[i - 1][j], dp[i - 1][j - 1]) + arr[i][j] 로 점화식을 세웠다.
풀이
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
int[][] arr = new int[N][N];
int[][] dp = new int[N][N];
int max = 0;
int cnt = 1;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < cnt; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
dp[i][j] = arr[i][j];
if (i > 0 && j == 0) {
dp[i][j] = dp[i - 1][j] + arr[i][j];
} else if (i > 0 && j == cnt - 1) {
dp[i][j] = dp[i - 1][j - 1] + arr[i][j];
} else if (i > 0) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1]) + arr[i][j];
}
max = Math.max(max, dp[i][j]);
}
cnt++;
}
System.out.println(max);
}
}
입력을 받으면서 dp 배열을 채웠기 때문에 cnt를 따로 두어 풀이하였다.