-
[Java/자바][백준 1932: 정수 삼각형]아가개발자/자료구조,알고리즘 2021. 8. 17. 13:20
https://www.acmicpc.net/problem/1932
Problem
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
위 그림은 크기가 5인 정수 삼각형의 한 모습이다.
맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.
삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.
Input
첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.
Output
첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다.
Insight
1. DP(동적 계획법)을 통해서 문제를 해결할 수 있다.
2. N*N 배열에 삼각형 수를 저장한다고 할 때 첫 번째 줄에는 한 개의 값이, 두 번째 줄에는 두 개의 값이, N번째 줄에는 N개의 값이 저장된다.
3. i번째 줄에 j번째의 값은 i-1번째 줄의 j-1번째 값 또는 j번째 값으로 부터 내려온다.
4. 3번을 참고하여 점화식을 세워보자!
=> d[i][j] = MAX(d[i-1][j-1], d[i-1][j]) + arr[i][j]
5. N번째 줄까지 모두 계산이 끝났다면 N번째 줄 중에서 가장 큰 값을 찾아서 출력한다.
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)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); int N = Integer.parseInt(br.readLine()); int[][] arr = new int[N+1][N+1]; int[][] d = new int[N+1][N+1]; for(int i=1; i<=N; i++) { StringTokenizer st = new StringTokenizer(br.readLine()," "); for(int j=1; j<=i; j++) { arr[i][j] = Integer.parseInt(st.nextToken()); } } for(int i=1; i<=N; i++) { for(int j=1; j<=i; j++) { if(i==1) { d[i][j] = arr[i][j]; } else { d[i][j] = Math.max(d[i-1][j-1], d[i-1][j])+arr[i][j]; } } } int res = -1; for(int i=1; i<=N; i++) { if(d[N][i]>=res) { res = d[N][i]; } } bw.write(String.valueOf(res)+"\n"); bw.flush(); bw.close(); } }
'아가개발자 > 자료구조,알고리즘' 카테고리의 다른 글
[JAVA/자바 - 그래프] 인접 그래프 구현 (0) 2021.09.16 [JAVA/자바 - 그래프] 인접 행렬 구현 (0) 2021.09.15 [Java/자바][백준 2156: 포도주 시식] (0) 2021.08.17 [Java/자바][백준 1149: RGB 거리] (0) 2021.08.16 [Java/자바][백준 2579: 계단 오르기] (0) 2021.08.12