넘치게 채우기
[BOJ] 2096 - 내려가기 본문
https://www.acmicpc.net/problem/2096
BOJ - 내려가기
문제 유형: 다이나믹 프로그래밍
문제 난이도: Gold V
시간 제한: 1초
메모리 제한: 4MB
문제
N줄에 0 이상 9 이하의 숫자가 세 개씩 적혀 있다. 내려가기 게임을 하고 있는데, 이 게임은 첫 줄에서 시작해서 마지막 줄에서 끝나게 되는 놀이이다.
먼저 처음에 적혀 있는 세 개의 숫자 중에서 하나를 골라서 시작하게 된다. 그리고 다음 줄로 내려가는데, 다음 줄로 내려갈 때에는 다음과 같은 제약 조건이 있다. 바로 아래의 수로 넘어가거나, 아니면 바로 아래의 수와 붙어 있는 수로만 이동할 수 있다는 것이다. 이 제약 조건을 그림으로 나타내어 보면 다음과 같다.
별표는 현재 위치이고, 그 아랫 줄의 파란 동그라미는 원룡이가 다음 줄로 내려갈 수 있는 위치이며, 빨간 가위표는 원룡이가 내려갈 수 없는 위치가 된다. 숫자표가 주어져 있을 때, 얻을 수 있는 최대 점수, 최소 점수를 구하는 프로그램을 작성하시오. 점수는 원룡이가 위치한 곳의 수의 합이다.
입력
첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다.
출력
첫째 줄에 얻을 수 있는 최대 점수와 최소 점수를 띄어서 출력한다.
풀이
메모리의 사용을 줄이기 위해, 2D배열을 쓰지 않았다.
사실 순수 변수만으로 해낼 수 있다.
각 열을 기준으로 이전 행에서 가능한 열들로부터 가장 가능한 최대/최소 값들을 가져와서 현재열의 숫자와 더해서 저장해놓는다.
코드
C++
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char *argv[]) {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
vector<int> last_max(3, 0);
vector<int> last_min(3, 0);
vector<int> curr_max(3, 0);
vector<int> curr_min(3, 0);
int t1, t2, t3;
for (int i = 0; i < n; ++i) {
cin >> t1 >> t2 >> t3;
curr_max[0] = t1 + max(last_max[0], last_max[1]);
curr_max[1] = t2 + max(last_max[0], max(last_max[1], last_max[2]));
curr_max[2] = t3 + max(last_max[1], last_max[2]);
curr_min[0] = t1 + min(last_min[0], last_min[1]);
curr_min[1] = t2 + min(last_min[0], min(last_min[1], last_min[2]));
curr_min[2] = t3 + min(last_min[1], last_min[2]);
last_max = curr_max;
last_min = curr_min;
}
cout << *max_element(curr_max.begin(), curr_max.end()) << " "
<< *min_element(curr_min.begin(), curr_min.end()) << "\n";
return 0;
}
변수 6개:
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char *argv[]) {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
int max0 = 0, max1 = 0, max2 = 0;
int min0 = 0, min1 = 0, min2 = 0;
int t1, t2, t3;
for (int i = 0; i < n; ++i) {
cin >> t1 >> t2 >> t3;
int new_max0 = t1 + max(max0, max1);
int new_max1 = t2 + max({max0, max1, max2});
int new_max2 = t3 + max(max1, max2);
int new_min0 = t1 + min(min0, min1);
int new_min1 = t2 + min({min0, min1, min2});
int new_min2 = t3 + min(min1, min2);
max0 = new_max0;
max1 = new_max1;
max2 = new_max2;
min0 = new_min0;
min1 = new_min1;
min2 = new_min2;
}
cout << max({max0, max1, max2}) << " " << min({min0, min1, min2}) << "\n";
return 0;
}
'PS > BOJ' 카테고리의 다른 글
[BOJ] 12865 - 평범한 배낭 (0) | 2024.11.04 |
---|---|
[BOJ] 9251 - LCS (0) | 2024.11.03 |
[BOJ] 17070 - 파이프 옮기기 1 (0) | 2024.11.01 |
[BOJ] 1991 - 트리 순회 (0) | 2024.10.31 |
[BOJ] 1932: 정수 삼각형 (0) | 2024.10.30 |