-
백준 2096번 : 내려가기알고리즘 공부 2020. 4. 8. 22:27
만약 평범한 DP 문제였다면 그렇게 어렵지 않았을 것이다. 하지만 이 문제가 골드 4인 이유는 메모리 제한 때문이겠지! 그래서 원래라면 100000 * 3 짜리 2차원 array를 3개 정도 만들어서 기록하면서 진행했겠지만 그렇게하면 메모리 초과가 발생하기 때문에 한 줄 입력을 받을 때마다 바로 계산하는 방식으로 했다. 계산 자체는 그렇게 어렵지 않다. 문제에서 설명하는 그대로 max함수와 min함수를 이용해서 계산하면 된다.
#include <stdio.h> #include <iostream> using namespace std; int n; int map[3], maxCnt[3], minCnt[3]; int main() { cin >> n; for(int i = 0; i < n; i++) { cin >> map[0] >> map[1] >> map[2]; if(i == 0) { maxCnt[0] = map[0]; maxCnt[1] = map[1]; maxCnt[2] = map[2]; minCnt[0] = map[0]; minCnt[1] = map[1]; minCnt[2] = map[2]; } else { int preMaxCnt[3] = { maxCnt[0], maxCnt[1], maxCnt[2] }; maxCnt[0] = max(preMaxCnt[0], preMaxCnt[1]) + map[0]; maxCnt[1] = max(max(preMaxCnt[0], preMaxCnt[1]), preMaxCnt[2]) + map[1]; maxCnt[2] = max(preMaxCnt[1], preMaxCnt[2]) + map[2]; int preMinCnt[3] = { minCnt[0], minCnt[1], minCnt[2] }; minCnt[0] = min(preMinCnt[0], preMinCnt[1]) + map[0]; minCnt[1] = min(min(preMinCnt[0], preMinCnt[1]), preMinCnt[2]) + map[1]; minCnt[2] = min(preMinCnt[1], preMinCnt[2]) + map[2]; } } cout << max(max(maxCnt[0], maxCnt[1]), maxCnt[2]) << " " << min(min(minCnt[0], minCnt[1]), minCnt[2]); return 0; }
'알고리즘 공부' 카테고리의 다른 글
백준 11049번 : 행렬 곱셈 순서 (0) 2020.04.10 백준 10942번 : 팰린드롬? (0) 2020.04.09 백준 1937번 : 욕심쟁이 판다 (0) 2020.04.06 백준 11054번 : 가장 긴 바이토닉 부분 수열 (0) 2020.04.06 백준 14002번 : 가장 긴 증가하는 부분 수열 4 (0) 2020.04.04