본문 바로가기
백준

[백준 1932] 정수 삼각형, C++

by 황인태(intaehwang) 2020. 1. 15.
반응형

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

 본 문제는 1994 International Olympiad in Informatics 1번 문제다.

<크기가 5인 정수 삼각형>

맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 선택된 수의 합이 최대가 되는 값을 구하는 문제다. 위 층에서 아래층으로 더했을 때 큰 값을 선택하는 방법보다. 아래층에서 위층 중 어떤 수를 더했을 때, 값이 커지는 가를 찾는 것이 코딩하기 쉽다. 즉, 2층 첫 번째 숫자 3과 3층의 8, 1을 더하는 것보다. 3층의 두 번째 숫자 1과 2층의 3과 8중 1과 더해서 큰 값을 1에 저장하는 것이다. 따라서, (실제 입력은 2차원 배열이다.) d[i][j] = max(d[i-1][j-1], d[i-1][j]) + a[i][j] 계산한다. 이때, 각 층의 바깥쪽 숫자는 계산할 방법이 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
#include <cstdio>
#include <algorithm>
 
using namespace std;
 
int d[500][500];
int a[500][500];
 
int main() {
    int n;
    scanf("%d"&n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j <= i; j++) {
            scanf("%d"&a[i][j]);
        }
    }
    d[0][0= a[0][0];
    for (int i = 1; i < n; i++) {
        for (int j = 0; j <= i; j++) {
            if (j == 0) d[i][j] = d[i-1][j] + a[i][j];
            else if (j == i) d[i][j] = d[i-1][j-1+ a[i][j];
            else d[i][j] = max(d[i-1][j-1], d[i-1][j]) + a[i][j];
        }
    }
    int ans = 0;
    for (int i = 0; i < n; i++) {
        if (ans < d[n-1][i]) ans = d[n-1][i];
    }
    printf("%d", ans);
}
cs
반응형

'백준' 카테고리의 다른 글

[백준 16236] 아기 상어, C++  (0) 2020.01.31
[백준 15686] 치킨 배달, C++  (0) 2020.01.31
[백준 2156] 포도주 시식, C++  (0) 2020.01.14
[백준 1212] 8진수 2진수, C++  (0) 2020.01.13
[백준 1373] 2진수 8진수, C++  (0) 2020.01.13
Buy me a coffeeBuy me a coffee

댓글