#include <iostream>
#define MAX_SIZE 501
#define MAX(x, y) (x < y ? y : x)
using namespace std;
int dp[MAX_SIZE][MAX_SIZE];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cin >> dp[i][j];
if (j == 1) { // 맨 왼쪽
dp[i][j] += dp[i - 1][j];
}
else if (i == j) { // 맨 오른쪽
dp[i][j] += dp[i - 1][j - 1];
}
else { // 중간은 둘 중 큰 값 저장
dp[i][j] += MAX(dp[i - 1][j - 1], dp[i - 1][j]);
}
}
}
// DP에 피라미드 형식으로 값이 저장됨
// 마지막 줄에 있는 최댓값 찾아서 출력
int ans = dp[n][0];
for (int i = 1; i <= n; i++) {
if (ans < dp[n][i]) {
ans = dp[n][i];
}
}
cout << ans << "\n";
return 0;
}
#include <iostream>
#define MAX_SIZE 501
#define MAX(x, y) (x < y ? y : x)
using namespace std;
int main() {
int n, x;
cin >> n;
int dp[MAX_SIZE];
int arr[MAX_SIZE];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cin >> x;
if (i == 1) { // 맨 윗줄
arr[i] = x;
dp[i] = x;
}
else if (j == 1) { // 맨 왼쪽
arr[j] = dp[j] + x;
}
else if (j == i) { // 맨 오른쪽
arr[j] = dp[j - 1] + x;
}
else { // 중앙
arr[j] = x + MAX(dp[j], dp[j - 1]);
}
}
// 저장된 합을 DP배열에 업데이트
for (int j = 1; j <= i; j++) {
dp[j] = arr[j];
}
}
// 배열에 저장된 값 중 최댓값 출력
int ans = dp[0];
for (int i = 1; i <= n; i++) {
if (ans < dp[i]) {
ans = dp[i];
}
}
cout << ans << '\n';
return 0;
}
(j == 1)
은 바로 윗층의 값과 더한 값(j == i)
은 바로 윗층 한칸 전과 더한 값2차원 배열은 501 * 501크기를 가지므로 메모리가 더 크게 나온다 !
2차원 배열 결과
1차원 배열 결과
중간에 제출 실수로 다시 제출했다..
1차원 배열 DP
는 입력 받은 값을 arr
배열에 계산하고 dp
배열에 업데이트 하는 방법으로 풀었다.
2차원 배열과 원리는 동일하다. 업데이트 하기 전까지는 이전 층의 결과값으로 계산하는 것과 같기 때문.
dp[j]
가 업데이트 전까지는 dp[i - 1][j]
와 같은 의미.