본문 바로가기
Algorithm/BOJ

[BOJ]1932번: 정수 삼각형(c++)

by HBGB 2020. 4. 23.

https://www.acmicpc.net/problem/1932

 

1932번: 정수 삼각형

문제 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 위 그림은 크기가 5인 정수 삼각형의 한 모습이다. 맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다. 삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는

www.acmicpc.net

 

 

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
45
46
47
48
49
#include <iostream>
#include <algorithm>
 
using namespace std;
 
const int MAX = 500;
int tri[MAX + 1][MAX + 1];
int D[MAX + 1][MAX + 1];
 
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    // 입력
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            cin >> tri[i][j];
        }
    }
 
    /*
        점화식 :
        D[i][j] = tri[i][j]로 올 수 있는 경로의 i - 1번째 최대값 
                + tri[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]) + tri[i][j];
        }
    }
 
    // 최대값 출력
    int max = D[n][1];
    for (int i = 2; i <= n; i++)
    {
        max = (max < D[n][i]) ? D[n][i] : max;
    }
    cout << max;
 
    return 0;
}
Colored by Color Scripter

 

 

모든 경로 중에서 최대값을 구하는 문제.

DP문제인걸 까먹고 그냥 첫번째 수부터 선택해서 내려왔다가 한참 헤맸다..

 

 

댓글