알고리즘 문제풀이/백준

[백준 1932번] 정수 삼각형

슥지니 2022. 5. 6. 02:47
반응형

문제 링크: https://www.acmicpc.net/problem/1932

 

1932번: 정수 삼각형

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

www.acmicpc.net

 

<문제 풀이> 다이나믹 프로그래밍(DP)

[테이블을 정의]

d[i][j] = i번째 층으로 갈 때 i번째 층에 있는 수들 중에서 j번째 수로 가는 경로의 합의 최대

[점화식 정의]

d[i][j] = 왼쪽 위 대각선의 숫자를 고려해서 d[i][j]로 가는 경로의 합과 오른쪽 위 대각선의 숫자를 고려해서 d[i][j]로 가는 경로의 합의 최댓값 + d[i][j]

d[i][j] += max(d[i-1][j-1], //  왼쪽 위 대각선
                   d[i-1][j]); // 오른쪽 위 대각선

<C++ 소스 코드>

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
#include<iostream>
#include<algorithm>
using namespace std;
 
int n;
int d[501][501];
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    cin >> n;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            cin >> d[i][j];
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            d[i][j] += max(d[i - 1][j - 1], d[i - 1][j]);
            
        }
    }
    int res = 0;
    for (int i = 1; i <= n; i++) {
        res = max(res, d[n][i]);
    }
    cout << res;
 
}
cs

 

반응형