BOJ#1932 숫자삼각형
* 문제
* 풀이
▷ dp 정의
dp[i][j] : i층에서 j 를 선택했을 때, 0~i 층의 최대값
▷ dp 점화식
dp[i][j] = triangle[i][j] + max(dp[i-1][j-1], dp[i-1][j+1])
별로 어렵지 않은 문제였지만 시간초과로 고생을 좀 했습니다.
원인으로는 dp 초기값을 0으로 설정했는데
코드 64라인에서 dp값을 재활용 할 때,
원래 삼각형 값이 0인 경우와 dp 초기값 0인 경우를 구분하지 못해서 메모이제이션을 하지 못했기 때문입니다.
dp 초기값을 -1으로 고쳐서 해결하였습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
/**
* BOJ#1932 숫자삼각형
* https://www.acmicpc.net/problem/1932
*/
public class Main {
public static void main(String[] args) throws IOException {
int n;
int[][] triangle;
int[][] dp;
// input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
triangle = new int[n][n + (n - 1)];
dp = new int[n][n + (n - 1)];
for (int i = 0; i < n; i++) {
Arrays.fill(triangle[i], 0);
Arrays.fill(dp[i], -1);
}
int center = n - 1;
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < (i + 1) * 2; j += 2) {
triangle[i][center - i + j] = Integer.parseInt(st.nextToken());
}
}
// solve
int tempMax = 0;
for (int i = 0; i < 2 * n - 1; i += 2) {
int cost = solve(triangle, dp, n - 1, i);
tempMax = tempMax < cost ? cost : tempMax;
}
System.out.println(tempMax);
}
// dp[i][j] : i층에서 j를 선택했을 때, 0~i층까지의 최대합
// solve() : dp[i][j]를 구함
static int solve(int[][] triangle, int[][] dp, int depth, int num) {
if (num < 0 || num >= triangle[0].length || depth < 0) {
return 0;
}
if (dp[depth][num] != -1) {
return dp[depth][num];
}
return dp[depth][num] = triangle[depth][num] + Math.max(solve(triangle, dp, depth - 1, num - 1), solve(triangle, dp, depth - 1, num + 1));
}
}
'Algorithm > DP' 카테고리의 다른 글
BOJ#2532 먹이사슬 (Chain) (0) | 2017.02.21 |
---|---|
BOJ#2565 전깃줄 (0) | 2017.02.20 |
BOJ#1149 RGB거리 (0) | 2017.02.08 |
BOJ#9251 LCS (0) | 2017.02.06 |
BOJ#2293 동전1 (0) | 2017.01.24 |