문제
https://algospot.com/judge/problem/read/TRIANGLEPATH
걸린 시간
00 : 34 : 57 실패
풀이
C++
#include <stdio.h>
#include <iostream>
#include <string.h> // memset
using namespace std;
#define INF 987654321
int N;
int triangle[100][100];
int cache[100][100];
int solve(int r, int c){
int ans = triangle[r][c];
// 기저 사례 : 맨 아랫줄이면
if(r == N-1) return ans;
// 메모이제이션
int& ret = cache[r][c];
if(ret != -1) return ret;
return ret = max(solve(r+1, c), solve(r+1, c+1))+ans;
}
int main(){
int tc;
scanf("%d", &tc);
while(tc--){
int count = 1;
scanf("%d", &N);
memset(triangle, 0, sizeof(triangle));
memset(cache, -1, sizeof(cache));
for(int r = 0; r < N; r++){
for(int c = 0; c < count; c++){
scanf("%d", &triangle[r][c]);
}
count++;
}
printf("%d\n", solve(0, 0));
}
return 0;
}
dp 문제인 것도 알았고, 메모이제이션을 사용해 반복을 줄여야 하는 것도 알았는데 어디서 중복이 일어나는지를 찾지 못했다.
피보나치 수열처럼 규칙적인 값들의 합이 아닌 특정 위치의 결과값을 메모이제이션에 사용하는 경우는 접하지 못했던 유형이라 순환호출 과정을 손으로 몇번 그려보고 나서야 이해를 했다.
'ALGOSPOT' 카테고리의 다른 글
algospot MATCHORDER 출전 순서 정하기 (0) | 2020.08.26 |
---|---|
algospot TSP1 여행하는 외판원 문제 1 (0) | 2020.08.23 |
algospot WILDCARD 와일드카드 (0) | 2020.08.20 |
algospot JUMPGAME 외발 뛰기 (0) | 2020.08.19 |
algospot FESTIVAL 록 페스티벌 (0) | 2020.08.19 |
댓글