일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 백준
- 프로그래머스
- oracle
- 알고리즘
- DP
- 완전탐색
- Queue
- BFS
- Python
- HashMap
- Stack
- 그리디
- 스택
- 배열
- 탐색
- SQL
- 백트래킹
- 다리 만들기
- 아스키코드
- BufferedReader
- 구현
- 시뮬레이션
- 다이나믹프로그래밍
- 빅데이터
- Java
- 브루트포스
- LIS
- 새벽코딩
- dfs
- 문자열
- Today
- Total
새벽코딩
[백준] [1932] 정수 삼각형 (JAVA) (dp) 본문
https://www.acmicpc.net/problem/1932
2 초 | 128 MB | 85248 | 49391 | 37251 | 59.395% |
문제
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번째 줄까지 정수 삼각형이 주어진다.
출력
첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다.
※ JAVA 코드 (정수 만들기)
import java.io.*;
import java.util.*;
public class Main {
public static int N;
public static int[][] map;
public static int[][] dp;
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
N = Integer.parseInt(br.readLine());
map = new int[501][501];
dp = new int[501][501];
// input
for(int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 1; j <= i; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
dp[1][1] = map[1][1];
for(int i = 1; i < N; i ++) {
for(int j = 1; j < N; j++) {
int now = dp[i][j];
int left = now + map[i+1][j];
dp[i+1][j] = Math.max(dp[i+1][j], left);
int right = now + map[i+1][j+1];
dp[i+1][j+1] = Math.max(dp[i+1][j+1], right);
}
}
int result = 0;
for(int i = 1; i <=N; i++){
result = Math.max(result, dp[N][i]);
}
// output
System.out.println(result);
}
}
※ 생각정리 (정수 만들기)
1. dp 문제의 패턴을 가지고 있다.
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
dp[1][1] 부터 시작하여 맨 아래행에서 가장 큰 수를 찾으면 되는 문제이다.
왼쪽으로 가는 경우의 좌표 dp[i + 1][j], 오른쪽으로 가는 경우의 좌표 dp[i + 1][j + 1]에 값을 너어가면서 모든 좌표를 돈다.
예를 들어 현재 dp[2][0]일때, dp[3][0], dp[3][1]에 각각 값을 넣어줄 수 있다.
먼저 dp[2][0]의 값이 10일때 dp[3][0]은 18이고 dp[3][1]은 11이되게 된다.
다음 현재가 dp[2][1]일때 dp[3][1]과 dp[3][2]를 채워줄 수 있다. 이때 기존에 dp[3][1]에 있는 값 11과 dp[2][1] + map[3][1]값을 더한 수를 비교해서 더 큰 수를 dp[3][1]에 넣어준다.
위를 좌표 끝까지 반복해주며 큰값을 담는다.
- 새벽코딩 -
'알고리즘' 카테고리의 다른 글
[백준] [1010] 다리 놓기 (JAVA) (dp) (0) | 2023.10.16 |
---|---|
[백준] [1912] 연속합 (JAVA) (dp) (1) | 2023.10.16 |
[백준] [11726] 2 x n 타일링 (JAVA) (dp) (0) | 2023.10.11 |
[백준] [1463] 1로 만들기 (JAVA) (dp) (0) | 2023.10.11 |
[백준] [2839] 설탕 배달 (JAVA) (dp) (3) | 2023.10.10 |