코딩테스트 준비/종만북
[종만북] - 삼각형 위의 최대경로(DP)
SeoburiFaust
2024. 3. 14. 20:44
문제
https://www.algospot.com/judge/problem/read/TRIANGLEPATH
algospot.com :: TRIANGLEPATH
삼각형 위의 최대 경로 문제 정보 문제 6 1 2 3 7 4 9 4 1 7 2 7 5 9 4 위 형태와 같이 삼각형 모양으로 배치된 자연수들이 있습니다. 맨 위의 숫자에서 시작해, 한 번에 한 칸씩 아래로 내려가 맨 아래
www.algospot.com
접근방법
메모이제이션을 활용한다.
중복 계산을 없앨 수 있다.
완전 탐색이라면 최악의 경우 2^100 을 훨씬 넘어가지만,
메모이제이션을 활용하면, 저장된 값을 재사용가능하기 때문에,
100 * 100 = 10000 의 계산 내에서 해결 가능하다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
#define FOR(i, n) for (int i=0;i<(n);++i)
#define INF 987654321
int n, triangle[100][100];
int cache2[100][100];
// (y, x)의 위치부터 맨 아래줄까지 내려가면서 얻을 수 있는 최대 경로의 합을 반환한다.
int path2(int y, int x) {
//기저사례
if (y == n-1) return triangle[y][x];
//메모이제이션
int& ret = cache2[y][x];
if (ret != -1) return ret;
return ret = max(path2(y+1, x+1), path2(y+1, x)) + triangle[y][x];
}
int C;
int main () {
cin >> C;
while(C--) {
cin >> n;
memset(cache2, -1, sizeof(cache2));
memset(triangle, 0, sizeof(triangle));
FOR(i, n) FOR(j, i+1) cin >> triangle[i][j];
cout << path2(0, 0) << endl;
}
return 0;
}
개선할 점
<cstring> 헤더가 있어야 memset 함수를 사용할 수 있다.