HyeLog
백준_1932_정수 삼각형 본문
다이나믹 프로그래밍(dp) 문제였다. 점화식을 세울 때 규칙을 잘 생각해봐야했다.
삼각형에서 제일 왼쪽 수, 제일 오른쪽 수, 가운데에 있는 수들 이 각각 다른 점화식을 갖는다.
윗단에서 선택한 숫자의 위치가 밑단에서 선택할 수 있는 숫자의 위치에 영향을 주기 때문이다. (왼쪽, 오른쪽 대각선)
#include <iostream>
#include <algorithm>
#define MAX 501
using namespace std;
int n, d[MAX][MAX], arr[MAX][MAX], answer;
void dp() {
d[1][1] = arr[1][1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
if (j == 1) { // 삼각형에서 제일 왼쪽 수
d[i][j] = d[i - 1][j] + arr[i][j];
}
else if (j == i) { // 삼각형에서 제일 오른쪽 수
d[i][j] = d[i - 1][j - 1] + arr[i][j];
}
else { // 삼각형에서 가운데 수들
d[i][j] = max(d[i - 1][j], d[i - 1][j - 1]) + arr[i][j];
}
}
}
for (int i = 1; i <= n; i++) {
answer = max(answer, d[n][i]);
}
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cin >> arr[i][j];
}
}
dp();
cout << answer << '\n';
return 0;
}
'알고리즘' 카테고리의 다른 글
백준_11722_가장 긴 감소하는 부분 수열 (0) | 2022.02.07 |
---|---|
백준_11055_가장 큰 증가 부분 수열 (0) | 2022.02.07 |
백준_2156_포도주 시식 (0) | 2022.02.06 |
백준_11057_오르막수 (0) | 2022.02.02 |
백준_1309_동물원 (0) | 2022.02.02 |