www.acmicpc.net/problem/1932

 

1932번: 정수 삼각형

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

www.acmicpc.net

 

간단한 DP 문제였다.

삼각형이

 

n = 5

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

 

이런 식으로 주어진다면 가장 밑 줄에서 가장 큰 수를 얻으려면 

0번째 줄에서 그다음 줄로 현재 값에서 왼쪽으로 내려가던가, 오른쪽으로 내려가던가 이 두 가지 경우의 수만

따져주면 된다.

 

max(solve(x + 1, y + 1), solve(x + 1, y)) + ar[x][y]

 

table[x][y] 의 값은 결국 위의 식처럼 될 것이다.

 

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

int ar[501][501], d[501][501], n;

int solve(int x, int y) {
	if (x == n - 1) return ar[x][y];
	if (d[x][y] != -1) return d[x][y];

	return d[x][y] = max(solve(x + 1, y + 1), solve(x + 1, y)) + ar[x][y];
}

int main() {
	ios::sync_with_stdio(false); cin.tie(0);

	cin >> n;

	memset(d, -1, sizeof(d));

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

	cout << solve(0, 0) << endl;

	return 0;
}

 

삼각형이 0이 될 수 있으므로 -1로 초기화해줘야 안전할 것 같아서 memset으로 초기화해줬다.

'BOJ' 카테고리의 다른 글

BOJ 20055 컨베이어 벨트 위의 로봇  (0) 2020.11.02
BOJ 2293 동전 1, 2294 동전 2  (0) 2020.10.23
BOJ 4195 친구 네트워크  (0) 2020.10.17
BOJ 1976 여행 가자  (0) 2020.10.15
BOJ 2470 두 용액  (0) 2020.10.11

+ Recent posts