티스토리 뷰

PS

백준 1932. 정수 삼각형

tose33 2021. 3. 10. 19:19

www.acmicpc.net/problem/1932

 

1932번: 정수 삼각형

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

www.acmicpc.net

 

이전에 푼 RGB거리와 아주 유사해서 쉽게 푼 문제. (tose33.tistory.com/106)

 

 

아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다,

 

d[n][0] : n층 0번째 요소를 선택했을때 합의 최댓값.

d[n][1] : n층 1번째 요소를 선택했을때 합의 최댓값.

 

아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있으므로,

이전 층의 좌측과 우측에 있는 수 중 큰값에, 현재 값을 더하면 된다.

 

예를들어, d[4][1]을 구한다고 하면,

d[3][0](18)과 d[3][1](16) 중 큰 값에 tri[4][1](7)을 더하면 된다.

 

tri[]
d[]

 

 

#include <iostream>
using namespace std;
#include <algorithm>

int tri[501][501];
int d[501][501];

int main() {
    int n;
    cin >> n;

    // triangle input
    for(int i = 1; i <= n; i++) {
        for(int j = 0; j < i; j++) {
            cin >> tri[i][j];
        }
    }

    d[1][0] = tri[1][0];

    // bottom-up
    for(int i = 2; i <= n; i++) {
        for(int j = 0; j < i; j++) {
            if(j == 0) { // 첫 요소
                d[i][j] = d[i-1][0] + tri[i][0];
            }
            else if(j == i-1) { // 마지막 요소
                d[i][j] = d[i-1][j-1] + tri[i][j];
            }
            else { // 가운데 요소
                d[i][j] = max(d[i-1][j-1], d[i-1][j]) + tri[i][j];
            }
        }
    }

    cout << *max_element(d[n], d[n]+n+1);
}

'PS' 카테고리의 다른 글

백준 2565. 전깃줄  (0) 2021.03.12
백준 2579. 계단 오르기  (0) 2021.03.11
백준 1149. RGB거리  (0) 2021.03.10
백준 9461. 파도반 수열  (0) 2021.03.10
백준 1904. 01타일  (0) 2021.03.09
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함