문제링크 : https://www.acmicpc.net/problem/1932
이 문제는 DP를 사용하여 삼각형의 꼭대기부터 최 하위층까지 어떤 경로를 택했을 때 경로를 이루는 원소의 합의 최댓값을 고르는 문제 입니다.
왜 DP일까요? 우리는 여러 경로를 따라가다 보면 중복되어 계산되는 위치의 원소가 있습니다. 이때 이 원소까지 오는 길을 최적화 하기 위해(계산을 덜 하기 위해) cache에 메모 해두는 것 입니다.
한 원소당 두가지 경우가 있으므로(좌, 우) 두 경우중 가장 큰 수를 캐싱합니다.
소스코드 :
이 문제는 DP를 사용하여 삼각형의 꼭대기부터 최 하위층까지 어떤 경로를 택했을 때 경로를 이루는 원소의 합의 최댓값을 고르는 문제 입니다.
왜 DP일까요? 우리는 여러 경로를 따라가다 보면 중복되어 계산되는 위치의 원소가 있습니다. 이때 이 원소까지 오는 길을 최적화 하기 위해(계산을 덜 하기 위해) cache에 메모 해두는 것 입니다.
한 원소당 두가지 경우가 있으므로(좌, 우) 두 경우중 가장 큰 수를 캐싱합니다.
소스코드 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <string>
using namespace std;
int n;
vector<vector<int> > graph(501, vector<int>(501));
vector<vector<int> > cache(501, vector<int>(501, -1));
int DP(int a, int b) {
// 맨 아랫단에 도착한 경우
if (a == n) {
return graph[a][b];
}
// 이전의 발자취가 있을 경우
if (cache[a][b] != -1) {
return cache[a][b];
}
cache[a][b] = -1;
int na = a + 1;
int nb1 = b;
int nb2 = b + 1;
// 삼각형의 높이가 최대 높이를 오버하지 않는경우에만,
if (na <= n) {
// 왼쪽으로 가는게 1 이상인 경우에만, 혹은
if (nb1 >= 1) {
cache[a][b] = max (cache[a][b], graph[a][b] + DP(na, nb1));
}
// 오른쪽으로 가는게 그 높이에서 가질수있는 원소의 개수를 넘지 않는경우에만
if (nb2 <= na) {
cache[a][b] = max(cache[a][b], graph[a][b] + DP(na, nb2));
}
// 최댓값을 고른다.
}
return cache[a][b];
}
| cs |
댓글
댓글 쓰기