연두색 부분은 j == 0 일때
하늘색 부분은 i == j 일때
보라색 부분은 둘다 해당되지 않는 경우이다.
현재 i 행의 j번째 위치까지의 최대 합은 i행의 j번째로 입력 받은 값
triangle[i][j]와 이전 i - 1행의 j - 1번째 triangle[i - 1][j - 1] 혹은 j번째까지의 합 triangle[i - 1][j] 중 최대값을 더한 값이다.
단, 0번째 위치의 값은 j - 1번째가 존재하지 않고 삼각형의 끝 위치에 있는 값은
j번째 값이 존재하지 않으므로 예외 처리를 해준다.
코드로 나타내면 다음과 같다.
import java.io.*;
import java.util.StringTokenizer;
public class t1932 {
static int[][] triangle;
static BufferedReader br;
static BufferedWriter bw;
static StringTokenizer st;
public static void main(String[] args) throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
triangle = new int[N + 1][N + 1];
triangle[0][0] = Integer.parseInt(br.readLine());
bw.write(dp(N)+"");
br.close();
bw.flush();
bw.close();
}
private static int dp(int n) throws IOException {
int max = 0;
for(int i = 1; i < n; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 0; j <= i; j++) {
triangle[i][j] = Integer.parseInt(st.nextToken());
if(j == 0)
triangle[i][j] += triangle[i - 1][j];
else if(j == i)
triangle[i][j] += triangle[i - 1][j - 1];
else
triangle[i][j] += Math.max(triangle[i - 1][j - 1], triangle[i - 1][j]);
max = Math.max(max, triangle[i][j]);
}
}
return max;
}
}
'Programming > algorithm' 카테고리의 다른 글
백준 10844번 쉬운 계단 수 dp 풀이 (0) | 2020.07.19 |
---|---|
백준 1463 자바 dp 풀이 and bfs 풀이 (0) | 2020.07.19 |
백준 2579 자바 풀이 (0) | 2020.07.15 |
백준 1904 자바 DP 풀이 (0) | 2020.07.14 |
[APIO 2010] 특공대 (Commando) 풀이 (0) | 2020.06.23 |