본문 바로가기
공부/알고리즘

[0621] 알고리즘

by Piva 2021. 6. 22.

1932. 정수 삼각형

  다이내믹 프로그래밍 문제. 원래는 재귀를 이용하여 해결하려 했지만 생각해보니 굳이 재귀 안 써도 반복문으로 풀 수 있겠다 싶어서 노선을 바꾸었다.

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>

int triangle[501][501];
int memory[501][501];

int main()
{
    std::cin.tie(NULL);
    std::ios_base::sync_with_stdio(false);

    int n, max = 0;    

    std::cin >> n;

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j <= i; j++)
        {
            std::cin >> triangle[i][j];
        }
    }

    memory[0][0] = triangle[0][0];

    for (int i = 1; i < n; i++)
    {
        for (int j = 0; j <= i; j++)
        {
            if (j == 0)
            {
                memory[i][j] = memory[i - 1][j] + triangle[i][j];
            }
            else if (j == i)
            {
                memory[i][j] = memory[i - 1][j - 1] + triangle[i][j];
            }
            else
            {
                memory[i][j] = (memory[i - 1][j - 1] > memory[i - 1][j] ? memory[i - 1][j - 1] : memory[i - 1][j]) + triangle[i][j];
            }
        }
    }

    for (int i = 0; i < n; i++)
    {
        if (max < memory[n - 1][i]) max = memory[n - 1][i];
    }

    std::cout << max << '\n';

    return 0;
}

 

  memory 배열은 삼각형 속 각 숫자까지 도달할 때 나올 수 있는 각 경로 속 숫자들의 합의 최대값을 저장한다. 이 배열을 이용해 (i, j)의 최대값은 그 위에 있는 두 수((i-1, j-1)랑 (i-1, j)) 중 더 큰 값에 자신의 값을 더하여 구하는 식으로 진행.

 

  조금 더 생각해보면 재귀로도 풀 수 있지 않을까?

'공부 > 알고리즘' 카테고리의 다른 글

[0624] 알고리즘  (0) 2021.06.25
[0622] 알고리즘  (0) 2021.06.23
[0620] 알고리즘  (0) 2021.06.21
[0615] 알고리즘  (0) 2021.06.16
[0614] 알고리즘  (0) 2021.06.15