맨 위층 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';
}