Algorithm/백준

[C][백준] 1932. 정수 삼각형 구현하기 | Dynamic Programming

이무기뱀술 2023. 3. 3. 14:45
728x90

#include <stdio.h>
#define MAX_NUM 505

int main(void)
{
    int table[MAX_NUM][MAX_NUM] = {0};
    int dp[MAX_NUM][MAX_NUM] = {0};
    int num;
    scanf("%d", &num);

    // 입력
    for (int i = 1; i <= num; i++)
    {
        for (int j = 0; j < i; j++)
        {
            scanf("%d", &table[i][j]);
        }
    }

    // dp 테이블 끝 요소 채우기
    dp[1][0] = table[1][0];
    for (int i = 2; i <= num; i++)
    {
        dp[i][0] = dp[i - 1][0] + table[i][0];
        dp[i][i - 1] = dp[i - 1][i - 2] + table[i][i - 1];
    }

    // dp
    for (int i = 3; i <= num; i++)
    {
        for (int j = 1; j < num; j++)
        {
            int left = dp[i - 1][j - 1];
            int right = dp[i - 1][j];

            if (left <= right)
            {
                dp[i][j] = table[i][j] + right;
            }
            else
            {
                dp[i][j] = table[i][j] + left;
            }
        }
    }

    // 맨 마지막 줄 중 가장 큰 수
    int result = 0;
    for (int k = 0; k < num; k++)
    {
        if (result < dp[num][k])
            result = dp[num][k];
    }

    printf("%d", result);

    return 0;
}

맨 위층에서 아래층까지의 합이 최대가 되는 경로를 구하는 문제이다.

 

이 문제는 DP로 풀어야한다. DP 문제를 다차원배열 단원에서 풀어야 한다니... ㄷㄷ

 

DP 테이블 끝 요소 채우는 것은 괜히 만든 것 같다.

 

 

728x90