알고리즘 :: 백준 :: DP :: 1932 :: 정수 삼각형

Embedded June·2020년 9월 20일
0

알고리즘::백준

목록 보기
53/109

문제

문제 링크

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

문제접근

  • 혹시나해서 말하지만 굳이 문제 예시 그림과 같이 정삼각형 형태로 저장할 필요는 없음을 알린다.
  • 이동할 수 있는 경우의 수가 대각선 왼쪽 또는 대각선 오른쪽이다.
    • 대각선 왼쪽 이동 = 아래 이동: (y, x) -> (y + 1, x)
    • 대각선 오른쪽 이동: (y, x) -> (y + 1, x + 1)

코드

// https://www.acmicpc.net/problem/1932
#include <iostream>
using namespace std;

static int n, triangle[501][501], memo[501][501];

int solve(int y, int x) {
    if (n < y || n < x) return 0;
    if (memo[y][x] != 0) return memo[y][x];

    return memo[y][x] = triangle[y][x] + max(solve(y + 1, x), solve(y + 1, x + 1));
}

int main() {
    ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    cin >> n;
    for (int y = 1; y <= n; ++y)
        for (int x = 1; x <= y; ++x)
            cin >> triangle[y][x];
    cout << solve(1, 1) << '\n';
}

결과

profile
임베디드 시스템 공학자를 지망하는 컴퓨터공학+전자공학 복수전공 학부생입니다. 타인의 피드백을 수용하고 숙고하고 대응하며 자극과 반응 사이의 간격을 늘리며 스스로 반응을 컨트롤 할 수 있는 주도적인 사람이 되는 것이 저의 20대의 목표입니다.

0개의 댓글