알고리즘/다이나믹프로그래밍(Dynamic Programming)
[백준-1932]-[다이나믹프로그래밍] - 정수 삼각형
팡스
2018. 11. 9. 15:45
문제링크 : https://www.acmicpc.net/problem/1932
이문제는 백준-1149번 RGB 구하는 문제와 비슷한 형식을 가진다.
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
한칸 한칸 내려가면서 본인의 최대값을 지니고 있고
좌우 대각선 위의 값들을 비교해서 그중 큰 값에 자신의 값을 더한게 본인의 최대값이다.
순서대로 가보면 첫번째 값이 7 이 들어오고 7의 최대값은 7이다.
두번째 줄에 3 8 이 들어오고 각각의 최대 값을 구하면
3 의 왼쪽 위 0
3 의 오른쪽 위 7
8 의 왼쪽 위 7
8 의 오른쪽 위 0
3의 최대값은 10
8의 최대값은 15
로 아래와 같은 삼각형이 나온다.
7
10 15
세번째 줄은 8, 1, 0 이 입력 됐고
같은 방법으로 계산하면 정수 피라미드는 아래처럼 나온다.
7
10 15
18 16 15
네번째 줄은 2, 7, 4, 4 가 입력 됐고
7
10 15
18 16 15
20 25 20 20
다섯번째 줄은 4, 5, 2, 6, 5 가 입력 됐고
7
10 15
18 16 15
20 25 20 20
24 30 27 26 25
그래서 최대 값은 30 이 나오게 된다.
계산 되는 점화식은 아래와 같이 구해진다.
LEFT = sum[i-1][j-1] + arr[i][j]
RIGHT = sum[i-1][j] + arr[i][j]
sum[i][j] = max(left, right) + arr[i][j]
점화식도 구했으니 이제 코딩을 해보자
소스
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class E_1932 { public static void main(String[] args) throws NumberFormatException, IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = null; int num = Integer.parseInt(br.readLine()); int arr[][] = new int[num+1][num+1]; long sum[][] = new long[num+1][num+1]; long max = Long.MIN_VALUE; for(int i=1; i <= num; i++) { st = new StringTokenizer(br.readLine()); for(int j=1; j <= i; j++) { arr[i][j] = Integer.parseInt(st.nextToken()); // 왼쪽 위가 있을경우 long left = sum[i-1][j-1] + arr[i][j]; // 오른쪽 위가 있을경우 long right = sum[i-1][j] + arr[i][j]; sum[i][j] = Math.max(left, right); max = Math.max(sum[i][j], max); } } System.out.println(max); } } | cs |