#include <iostream>
#include <algorithm>
using namespace std;
int triangle[501][501];
int dp[501][501];
int triSize;
int solve(int i, int j) {
int& ret = dp[i][j];
if (ret > -1) return ret;
if (i == triSize - 1 && j == triSize - 1) return ret = triangle[i][j];
return ret = max(solve(i + 1, j), solve(i + 1, j + 1)) + triangle[i][j];
}
int main() {
cin >> triSize;
for (int i = 0; i < triSize; i++) for (int j = 0; j < triSize; j++) dp[i][j] = -1;
for (int i = 0; i < triSize; i++) {
for (int j = 0; j <= i; j++) {
cin >> triangle[i][j];
}
}
cout << solve(0, 0) << endl;
return 0;
}
dp[i][j] = max(dp[i+1][j], dp[i+1][j+1]) + triangle[i][j]
이제 dp 왕초보 문제는 무난히 풀 수 있게 되었다
'코딩 > 알고리즘' 카테고리의 다른 글
[C#] 백준 2749 피보나치수 3 (0) | 2017.05.28 |
---|---|
백준 9252 LCS2 (0) | 2017.05.27 |
백준 9461 파도반수열 (0) | 2017.05.27 |
백준 1912 연속합 (0) | 2017.05.27 |
백준 2965 캥거루 세마리 (0) | 2017.05.27 |