Plite
전자오락 공방
Plite
전체 방문자
오늘
어제
  • 분류 전체보기 (274)
    • 프로젝트 (18)
      • 완성 프로젝트 (3)
      • 프로젝트 진행 내역 (15)
    • 공부 및 정리 (241)
      • 백준 코드 (222)
      • C++ (8)
      • DirectX (2)
      • Unreal Engine (6)
      • 프로그래밍 패턴 (3)
    • 기타 (12)
      • 기타 주저리 (10)
    • 게임과 취미 (1)
    • 대문 (1)

블로그 메뉴

  • 홈
  • 프로젝트
  • 취미, 일상
  • 백준 프로필

공지사항

  • [Read Me]
  • 제 블로그에 방문하신 것을 환영합니다.

인기 글

태그

  • 유니온 파인드
  • UC++
  • 트라이
  • SCC
  • 기하
  • 세그먼트 트리
  • 동적계획법
  • 구현
  • 정렬
  • 트리
  • C++
  • LCA
  • 분할정복
  • 최소 스패닝 트리
  • 큐
  • 그래프
  • 누적합
  • 스택
  • 우선순위큐
  • 브루트포스
  • 문자열
  • 조합론
  • KMP
  • 백준
  • 정수론
  • 위상 정렬
  • 백트래킹
  • 수학
  • 이분탐색
  • 투포인터

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Plite

전자오락 공방

[C++] 백준 - 2096번 문제
공부 및 정리/백준 코드

[C++] 백준 - 2096번 문제

2022. 12. 1. 10:49

2096번: 내려가기 (acmicpc.net)

 

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
    '공부 및 정리/백준 코드' 카테고리의 다른 글
    • [C++] 백준 - 2240번 문제
    • [C++] 백준 - 2167번 문제
    • [C++] 백준 - 2342번 문제
    • [C++] 백준 - 1202번 문제
    Plite
    Plite
    개발 일지, 게임 이야기 등을 적어두는 공간입니다.

    티스토리툴바