Algorithm, boj, 1932(정수 삼각형), dp

DP(다이나믹 프로그래밍)

  • 주어진 문제를 여러 개의 부분문제들로 나누어 푼 다음, 그 결과들로 주어진 문제를 푼다
  • dp는 겹치는 문제가 발생하기 때문에 메모제이션 등이 필요하다

    해결하지 못한 원인

  • dp문제는 겹치는 문제가 발생한다. 즉, 앞에서 누적된 결과로 현재 문제가 풀리기 때문에 누적된 것을 어떻게 활용하고 쉽게 수식으로 풀 수 있을지 생각해보자.
  • 문제를 쉽게 도식화해서 생각해보자 ㅠ

    문제 풀이

  • 양쪽 끝의 최고합은 고정
    • if(j==1) list[i][1] = list[i][1] + list[i-1][1];
    • if(i==j) list[i][j] = list[i][j] + list[i-1][j-1];
  • 양쪽 끝이 아니라면 두 부모중 더 큰 값을 선택
    • list[i][j] = list[i][j] + Math.max(list[i-1][j-1], list[i-1][j])
 package org.baekjoon;

import java.util.Scanner;

public class test1932 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		  Scanner sc = new Scanner(System.in);

		  int n = sc.nextInt();
		  int[][] list = new int[n+1][n+1];
		  int max = 0;
		  for (int i=1; i<=n; i++) {
			  for (int j=1; j<=i; j++) {
				  list[i][j] = sc.nextInt();

				  // 1. 왼쪽 대각선
				  if(j==1) list[i][1] = list[i][1] + list[i-1][1];
				  // 2. 오른쪽 대각선
				  else if(i==j) list[i][j] = list[i][j] + list[i-1][j-1];
				  // 3. 대각선이 아니라면 부모중에 큰값과 더한다.
				  else
					  list[i][j] = list[i][j] + Math.max(list[i-1][j-1], list[i-1][j]);

				  if (list[i][j] > max)
					  max = list[i][j];
			  }
		  }
		  System.out.println(max);
	}
}

Reference

문제바로가기 문제풀이