https://www.acmicpc.net/problem/1932
1. 풀이방법
- 최대 깊이가 500입니다.
- 모든 경우의 수를 모두 구하면 매우 커짐을 알 수 있습니다.
- 점화식을 세우고, 0과 i==j 일때 (한변에서 양 끝은 선택권이 한개씩 뿐) 처리를 따로 해주시면 됩니다.
- 바텀업 방식으로 작성했습니다.
2. 주의사항
- 없음
3. 나의코드
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
int triangle[500][500];
int dp[500][500];
int n;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < i + 1; j++) {
cin >> triangle[i][j];
dp[i][j] = -1;
}
}
dp[0][0] = triangle[0][0];
for (int i = 1; i < n; i++) {
for (int j = 0; j < i + 1; j++) {
if (j == 0) {
dp[i][j] = dp[i - 1][j] + triangle[i][j];
}
else if (j == i) {
dp[i][j] = dp[i - 1][j - 1] + triangle[i][j];
}
else {
dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j];
}
}
}
int maxr = -1;
for (int i = 0; i < n; i++) {
maxr = max(dp[n - 1][i], maxr);
}
cout << maxr << "\n";
return 0;
}
'알고리즘 문제풀이 > 다이나믹 프로그래밍' 카테고리의 다른 글
백준 3687 [C++] (0) | 2021.08.09 |
---|---|
백준 1103 [C++] (0) | 2021.07.06 |
백준 1793 [C++] (0) | 2021.02.04 |
백준 1965 [C++] (0) | 2021.02.03 |
백준 1463 [C++] - 메모리초과 (0) | 2020.12.15 |