[BOJ] 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