공부 자료/알고리즘

(C/C++) 백준 1932번 - 정수 삼각형

뚜루뚜루세니 2021. 8. 2. 10:29
728x90

문제출처: https://www.acmicpc.net/problem/1932

 

1932번: 정수 삼각형

첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.

www.acmicpc.net

1. 코드

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
#include <iostream>
#include <algorithm>
 
using namespace std;
int tri[501][501]; //각 위치의 값
int dp[501][501= { 0, }; // 그 위치로 갔을 때 합
 
int main() {
    int n;
    scanf("%d"&n);
 
    for (int i = 1; i <= n; i++) { //tri 배열에 입력받기
        for (int j = 1; j <= i; j++) {
            scanf("%d"&tri[i][j]);
        }
    }
    dp[1][1= tri[1][1];
    for (int i = 2; i <= n; i++) {
        for(int j = 1; j <= i; j++) {
            dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + tri[i][j];
            //합이 치대가 되기 위해서, 윗줄에서
            //왼쪽이나 오른쪽 중 큰 것 선택
        }
    }
 
    int Max = 0;
    for (int i = 1; i <= n; i++) {
        if (Max < dp[n][i])
            Max = dp[n][i];
    }
 
    printf("%d", Max);
}
cs

2. 해결과정

합이 최대가 되는 경로에 있는 수의 합을 출력.

2차원 배열로 각각 삼각형에 들어가는 값(tri)와, 그 위치로 갔을 때 숫자들의 합(dp)를 설정해준다.

합이 최대가 되어야하므로 윗줄에서 아랫줄을 선택할 때, 왼쪽과 오른쪽 중 큰 것을 선택해줘야한다.

따라서 dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + tri[i][j] 라는 점화식을 도출해낼 수 있다.

 

3. 느낀점

dp 문제는 처음 풀어봐서 어려웠다. 점화식을 도출해내는 것 자체가 어려웠던 문제

728x90