728x90
문제
아래와 같은 방식으로 숫자가 주어질 때,
맨 위에서 맨 아래 레벨로 순차적으로 합한 값중 제일 큰 값이 나오는 경우를 구하기
단, 다음 레벨에서 선택할 수 있는 숫자는 현재 레벨에서의 숫자로부터 대각선 좌우밖에 안됨
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
문제 링크 : https://www.acmicpc.net/problem/1932
원리
1. 재귀방식 : 나올 수 있는 모든 합산을 해보되, 합산한 최대값만 저장하는 방식. 매 합산은 처음 할당한 배열을 재사용함으로서 메모리 사용을 줄이는 방식을 사용 [시간 초과 발생]
2. DP 방식
나의 코드
1. 재귀 합산 [시간초과]
private static int T;
private static int[][] map;
private static int[] memory;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(br.readLine());
map = new int[T][T];
memory = new int[T + 1];
for (int i = 1; i <= T; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < i; j++) {
int token = Integer.parseInt(st.nextToken());
map[i - 1][j] = token;
}
}
memory[0] = map[0][0];
calculate(0, 0);
System.out.println(memory[T]);
}
private static void calculate(int now, int level) {
level++;
if (level >= T) {
if (memory[T] <= memory[T - 1]) memory[T] = memory[T - 1];
} else {
for (int i = 0; i < 2; i++) {
int nextIdx = now + i;
int nextNum = map[level][nextIdx];
memory[level] = memory[level - 1] + nextNum;
calculate(nextIdx, level);
}
}
}
레퍼런스 코드
챗 GPT를 이용한 코드
public class MaxPathSumInTriangle {
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[][] triangle = new int[n][n];
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j <= i; j++) {
triangle[i][j] = Integer.parseInt(st.nextToken());
}
}
int[][] dp = new int[n][n];
dp[0][0] = triangle[0][0];
for (int i = 1; i < n; i++) {
for (int j = 0; j <= i; j++) {
if (j == 0) {
dp[i][j] = dp[i-1][j] + triangle[i][j];
} else if (j == i) {
dp[i][j] = dp[i-1][j-1] + triangle[i][j];
} else {
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-1]) + triangle[i][j];
}
}
}
int maxPathSum = dp[n-1][0];
for (int j = 1; j < n; j++) {
maxPathSum = Math.max(maxPathSum, dp[n-1][j]);
}
bw.write(String.valueOf(maxPathSum));
bw.flush();
bw.close();
br.close();
}
}728x90
'알고리즘 저장소 (일반방식과 나만의 풀이) > JAVA' 카테고리의 다른 글
| [백준] no15650, 15652: N과 M (2, 3) - 기본 Combination 문제 (0) | 2023.04.26 |
|---|---|
| [백준] no16953: A -> B (0) | 2023.04.24 |
| [백준] no1629: 곱셈 (0) | 2023.04.20 |
| [백준] no1149: RGB거리 (0) | 2023.04.20 |
| [백준] no11718: 그대로 출력하기 (0) | 2023.04.12 |