PS/종만북

삼각형 위의 최대 경로 - DP

2022. 10. 4. 21:37

처음엔 무식하게 풀어본다. 이때 해당 문제가 최적 부분 구조를 만족한다는 것을 쉽게 알 수 있다. 예를 들어 임의의 수 A부터 시작한 최대 경로는 A 바로 아래 수부터 시작한 최대 경로(i), A 바로 오른쪽 아래 수부터 시작한 최대 경로(ii) 둘 중 하나다. i나 ii를 구할때 이전에 선택한 값 A는 필요없다. 최적 부분 구조를 만족하므로 DP를 적용해 중복되는 부분 문제를 제거한다.

 

함수 f는 x,y수를 시작으로 한 최대 경로의 숫자 합을 반환한다. 삼각형의 원소 개수만큼 부분 문제가 발생하므로 O(n)의 성능을 보인다.

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int testCase = Integer.parseInt(br.readLine());

        for(int t=0; t<testCase; t++) {
             int n = Integer.parseInt(br.readLine());
             int[][] tryangle = new int[n][n];
             int[][] dp = new int[n][n];

             for(int i=0; i<n; i++) {
                 st = new StringTokenizer(br.readLine(), " ");
                 for(int j=0; j<i+1; j++) {
                     tryangle[i][j] = Integer.parseInt(st.nextToken());
                 }
             }
             for(int i=0; i<n; i++)
                 for(int j=0; j<n; j++)
                     dp[i][j] = -1;
             
             int result = f(0,0,tryangle,dp);
             System.out.println(result);
        }
    }

    static int f(int x, int y, int[][] tryangle, int[][] dp) {
        if(x == tryangle.length - 1) return tryangle[x][y];

        if(dp[x][y] != -1) return dp[x][y];

        dp[x][y] = Math.max((f(x+1,y,tryangle,dp) + tryangle[x][y]), (f(x+1,y+1,tryangle,dp) + tryangle[x][y]));
        return dp[x][y];
    }
}

'PS > 종만북' 카테고리의 다른 글

출전 선수 정하기 - Greedy  (0) 2022.10.07
회의실 배정 - Greedy  (0) 2022.10.07
외발 뛰기 - DP  (1) 2022.10.04
게임판 덮기 - Brute Force  (0) 2022.10.03
소풍 - Brute Force  (0) 2022.10.02
'PS/종만북' 카테고리의 다른 글
  • 출전 선수 정하기 - Greedy
  • 회의실 배정 - Greedy
  • 외발 뛰기 - DP
  • 게임판 덮기 - Brute Force
gunjoon98
gunjoon98
gunjoon98
하루한방울
gunjoon98
전체
오늘
어제
  • 분류 전체보기 (139)
    • Computer Science (60)
      • Network (14)
      • DataBase (12)
      • Algorithm (14)
      • OS (9)
      • Computer Terminology (1)
      • DataStructure (10)
    • Spring (24)
      • Spring Basic (2)
      • Spring MVC (11)
      • Spring DB (4)
      • Spring Security (2)
      • Spring Test (1)
      • Spring Legacy (2)
      • 기타 (2)
    • Java (9)
      • Basic (7)
      • OOP (0)
    • WEB (14)
      • CSS (4)
      • JS (0)
      • HTTP (10)
    • PS (11)
      • 종만북 (10)
      • 모의 코테 (0)
      • 오답노트 (1)
    • Linux (6)
      • Ubuntu (6)
    • CM (5)
      • Git (5)
    • Project (0)
      • Deubot (0)
      • Scoreboard (0)
    • Infra (5)
      • Cloud (1)
      • CI&CD (3)
      • 쿠버네티스 (1)
    • Hadoop Echo System (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

hELLO · Designed By 정상우.
gunjoon98
삼각형 위의 최대 경로 - DP
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.