알고리즘 공부
백준 2096번 : 내려가기
EQ1
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;
}