알고리즘/PS - 백준

[백준 1932 - C++] 정수 삼각형 : DP

excited-hyun 2021. 4. 30. 11:35
반응형

www.acmicpc.net/problem/1932

 

1932번: 정수 삼각형

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

www.acmicpc.net

문제

위 그림은 크기가 5인 정수 삼각형의 한 모습이다.

맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.

삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다.

 

입력

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

 

출력

첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다.

 

예제 입력 1 

5

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

예제 출력 1

30

 

 풀이

매우 간단한 DP문제이다. 위에서부터 쭉 계산해서 결과를 저장해 나가는 방식이다.

계산 방식은 그냥 이전줄 계산 결과에 더하기만 하면 되는 것!

좌표가 좀 헷갈려서 주황색으로 써두고 풀이했당.

 

#include <iostream>
#include <cstdio>

int map[500][500];
int result[500][500];

int main(void){
    int n;
    int temp1, temp2;
    int max = 0;
    
    scanf("%d", &n);
    for(int i=0; i<n; i++){
        for(int j=0; j<i+1; j++){
            scanf("%d", &map[i][j]);
        }
    }
    result[0][0] = map[0][0];
    
    for(int i=1; i<n; i++){
        for(int j=0; j<i+1; j++){
            if(j==0)
                result[i][j] = result[i-1][j] + map[i][j];
            else if(j == i)
                result[i][j] = result[i-1][j-1]+map[i][j];
            else{
                temp1 = result[i-1][j-1] + map[i][j];
                temp2 = result[i-1][j] + map[i][j];
                if(temp1 > temp2)
                    result[i][j] = temp1;
                else
                    result[i][j] = temp2;
            }
        }
    }
    max = result[n-1][0];
    for(int i=1; i<n; i++){
        if(max < result[n-1][i])
            max = result[n-1][i];
    }
    printf("%d\n", max);
}
728x90
반응형