[BOJ] 1932 : 정수 삼각형

1932 : 정수 삼각형

풀이

경우의수를 따졌을 때 브루트포스 불가로 (500층의 경우의수 2^499개, 브루트포스 불가)

DP적 풀이를 떠올렸고 점화식을 세웠다. D[1…500]까지 만들고 1층 하고는 D[1]=7 2층 하고는 D[1] = 7+2 // D[2] = 7+8 3층하고는 D[1] = D[1] + A[1] , D[2] = A[2] + Max(D[1],D[2]) , D[3] = A[3] + Max(D[2],D[3]) …

코드

다이나믹프로그래밍

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;

//최대 500*501/2개
int A[126000];

int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n * (n + 1) / 2; i++) {
		cin >> A[i];
	}

	int D[501] = { 0 };

	int idx = 0;
	//층 순환
	for (int i = 1; i <= n; i++) {
		int tmp[501] = { 0 };
		//방 순환
		for (int j = 1; j <= i; j++) {
			idx++;
			//제일 왼쪽
			if (j == 1) {
				tmp[1] = D[1] + A[idx];
			}
			//제일 오른쪽
			else if (j == i) {
				tmp[j] = D[j - 1] + A[idx];
			}
			//중간
			else {
				tmp[j] = max(D[j - 1], D[j]) + A[idx];
			}
		}
		for (int j = 1; j <= i; j++) {
			D[j] = tmp[j];
		}
	}

	int maxNum = 0;
	for (int i = 1; i <= n; i++) {
		if (D[i] > maxNum) {
			maxNum = D[i];
		}
	}
	cout << maxNum;
	return 0;
}
Written on December 1, 2021