2096번: 내려가기
첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다.
www.acmicpc.net
2096번 : 내려가기
N줄에 0 이상 9 이하의 숫자가 세 개씩 적혀 있다. 내려가기 게임을 하고 있는데, 이 게임은 첫 줄에서 시작해서 마지막 줄에서 끝나게 되는 놀이이다.
먼저 처음에 적혀 있는 세 개의 숫자 중에서 하나를 골라서 시작하게 된다. 그리고 다음 줄로 내려가는데, 다음 줄로 내려갈 때에는 다음과 같은 제약 조건이 있다. 바로 아래의 수로 넘어가거나, 아니면 바로 아래의 수와 붙어 있는 수로만 이동할 수 있다는 것이다. 이 제약 조건을 그림으로 나타내어 보면 다음과 같다.
별표는 현재 위치이고, 그 아랫 줄의 파란 동그라미는 원룡이가 다음 줄로 내려갈 수 있는 위치이며, 빨간 가위표는 원룡이가 내려갈 수 없는 위치가 된다. 숫자표가 주어져 있을 때, 얻을 수 있는 최대 점수, 최소 점수를 구하는 프로그램을 작성하시오. 점수는 원룡이가 위치한 곳의 수의 합이다.
입력
첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다.
출력
첫째 줄에 얻을 수 있는 최대 점수와 최소 점수를 띄어서 출력한다.
생각해 볼 점
DP 문제입니다.
Bottom-Up으로 푸는게 쉽습니다.
문제 태그에는 슬라이딩 윈도우라고 쓰여 있는데..
굳이 슬라이딩 윈도우를 신경 써서 풀 필요는 없습니다.
슬라이딩 윈도우 알고리즘(Sliding Window) (feat. 투 포인트) (tistory.com)
슬라이딩 윈도우 알고리즘(Sliding Window) (feat. 투 포인트)
1. 슬라이딩 윈도우 알고리즘 (Sliding Window) ( 슬라이딩 윈도우 알고리즘 간단 예제 ) 1, 2, 3, 4, 5, 6, 7 로 이루어진 숫자 배열에서 A[i] + A[i+1] + A[i+2] 형식으로 연속적인 3개의 숫자의 합의 최댓값을
ji-musclecode.tistory.com
문제에서 나온대로 풀면 됩니다.
각 단계 별로, 최소값과 최대값을 저장하면서 나아가면 끝 단계에서 최소값, 최대값이 나옵니다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int N;
scanf("%d", &N);
int Arr[3] = {0, };
int prev[3][2] = {0, };
int dp[3][2] = {0, }; // {Min, Max}
//Bottom-Up DP
for(int i = 0; i < N; i++)
{
scanf("%d %d %d", &Arr[0], &Arr[1], &Arr[2]);
for(int i = 0; i < 3; i++)
{
if(i != 0)
{
dp[i][0] = min(dp[i][0], prev[i - 1][0]);
dp[i][1] = max(dp[i][1], prev[i - 1][1]);
}
if(i != 2)
{
dp[i][0] = min(dp[i][0], prev[i + 1][0]);
dp[i][1] = max(dp[i][1], prev[i + 1][1]);
}
dp[i][0] += Arr[i];
dp[i][1] += Arr[i];
}
for(int i = 0; i < 3; i++)
{
prev[i][0] = dp[i][0];
prev[i][1] = dp[i][1];
}
}
int minn = 9000000, maxx = 0;
for(int i = 0; i < 3; i++)
{
if(dp[i][0] < minn)
minn = dp[i][0];
if(maxx < dp[i][1])
maxx = dp[i][1];
}
printf("%d %d", maxx, minn);
return 0;
}
그 외
'공부 및 정리 > 백준 코드' 카테고리의 다른 글
[C++] 백준 - 2240번 문제 (0) | 2022.12.19 |
---|---|
[C++] 백준 - 2167번 문제 (0) | 2022.12.13 |
[C++] 백준 - 2342번 문제 (0) | 2022.11.30 |
[C++] 백준 - 1202번 문제 (0) | 2022.11.18 |
[C++] 백준 - 9935번 문제 (0) | 2022.11.17 |