https://www.acmicpc.net/problem/2096
2096번: 내려가기
첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다.
www.acmicpc.net
처음에 2차원 배열을 이용한 DP로 접근했다가 메모리 초과 계속나서 1차원 배열을 이용한 DP로 해결한 문제다. 전에 있던 값을 다른 공간에 저장해놓았다가 규칙에 맞게 움직이면 된다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
int mat[3]; //현재 입력한 수
int res_big[3]; //최대만 찾아간 결과
int res_small[3]; //최소만 찾아간 결과
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> mat[0] >> mat[1] >> mat[2];
if (i == 0) {
res_big[0] = mat[0];
res_big[1] = mat[1];
res_big[2] = mat[2];
res_small[0] = mat[0];
res_small[1] = mat[1];
res_small[2] = mat[2];
}
else {
//전에 있던 큰 값을 미리 저장
int temp1 = res_big[0];
int temp2 = res_big[1];
int temp3 = res_big[2];
//전에 있던 작은 값을 미리 저장
int temp4 = res_small[0];
int temp5 = res_small[1];
int temp6 = res_small[2];
//최댓값 찾기
res_big[0] = max(temp1, temp2) + mat[0]; //0번지는 전에 0번지, 1번지에서 찾아갈 수 있다.
res_big[1] = max(max(temp1, temp2),temp3) + mat[1]; //1번지는 전에 0번지, 1번지, 2번지에서 찾아갈 수 있다.
res_big[2] = max(temp2, temp3) + mat[2]; //2번지는 전에 1번지, 2번지에서 찾아갈 수 있다.
//최솟값 찾기
res_small[0] = min(temp4, temp5) + mat[0]; //0번지는 전에 0번지, 1번지에서 찾아갈 수 있다.
res_small[1] = min(min(temp4, temp5), temp6) + mat[1]; //1번지는 전에 0번지, 1번지, 2번지에서 찾아갈 수 있다.
res_small[2] = min(temp5, temp6) + mat[2]; //2번지는 전에 1번지, 2번지에서 찾아갈 수 있다.
}
}
//큰 값 경로 중 가장 큰 값, 작은 값 경로 중 가장 작은 값을 출력
cout << max(res_big[0], max(res_big[1], res_big[2])) << ' ' << min(res_small[0], min(res_small[1], res_small[2]));
}
'백준' 카테고리의 다른 글
백준11568 - 민균이의 계락 (0) | 2020.01.26 |
---|---|
백준2210 - 숫자판 점프 (0) | 2020.01.19 |
백준1654 - 랜선 자르기 (0) | 2020.01.16 |
백준9372 - 상근이의 여행 (0) | 2020.01.09 |
백준9019 - DSLR (0) | 2020.01.05 |