티스토리 뷰
출저 : https://www.acmicpc.net/problem/1932
"DP, bottom-up / DP라고 무조건 재귀 생각하지말자."
알고리즘은 삼각형의 맨 밑부분부터 시작해서 dp 갱신을 시작한다. 처음에 재귀로 구현했는데 시간초과가 났다. dp 값을 비교해서 기존 dp 값보다 작으면 탐색하지 못하게 하였는데??? 라고 생각했다. dp 값이 나중에 큰 값으로 갱신된다면, 이전 까지 탐색 경로들은 그냥 지나칠 거임..
따라서 해당 지점에 가능한 가장 큰 값이 맨 나중에 갱신되는 데이터가 주어졌다면 아마 dp 값 비교를 통한 가지치기는 적용 안될듯.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; class Main { static int n; static int[][] map; static int[][] dp; public static void main (String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); n = Integer.parseInt(br.readLine()); dp = new int[n][n]; map = new int[n][n]; for (int i = 0; i < n; i++) { StringTokenizer st = new StringTokenizer(br.readLine()); for (int j = 0; j < i+1; j++) { map[i][j] = Integer.parseInt(st.nextToken()); } } // 사각형의 맨 아래 부분에 dp 값을 갱신한다. for (int i = 0; i < n; i++) { dp[n-1][i] = map[n-1][i]; } // 삼각형 밑바닥 부터 dp값을 갱신하며 올라간다. for (int i = n-2; i >= 0; i--) { for (int j = 0; j <= i; j++) { // 하위 노드 두개에 대해 큰값을 선택한다. dp[i][j] = map[i][j] + Math.max(dp[i+1][j],dp[i+1][j+1]); } } System.out.println(dp[0][0]); } } | cs |
'Study > 알고리즘 문제풀이' 카테고리의 다른 글
백준 1003. 피보나치 함수 :: 돼지개발자 (0) | 2019.02.01 |
---|---|
백준 15685. 드래곤 커브 :: 돼지개발자 (0) | 2019.01.31 |
백준 10026. 적록색약 :: 돼지개발자 (0) | 2019.01.31 |
백준 15684. 사다리조작 :: 돼지개발자 (0) | 2019.01.31 |
백준 15683. 감시 :: 돼지개발자 (0) | 2019.01.30 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday