스쳐가는비
devtravel
스쳐가는비
전체 방문자
오늘
어제
  • 분류 전체보기 (108)
    • 🎵 Daily (0)
    • 📚 Computer Science (11)
      • Algorithm (9)
      • Design Pattern (2)
    • 🔥 Programming (23)
      • C# (3)
      • C++ (5)
      • WPF (0)
      • Python (1)
      • OpenCV (9)
      • ML & DL (5)
    • 🔥 Web (13)
      • HTML (6)
      • JavaScript (7)
    • 📌 Tool (2)
      • Git (2)
      • Etc (0)
    • 📖 Certificate (10)
      • 컴활 1급 (2)
      • SQL 개발자 (2)
      • 리눅스 마스터 (0)
      • 정보처리기사 (0)
      • 사무자동화산업기사 (0)
      • ADsP (6)
    • 💻 OnlineJudge (49)
      • Baekjoon (49)
      • GoormEdu (0)
GitHub Contribution
Loading data ...

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
스쳐가는비

devtravel

[백준 / BOJ] C++ 2096 내려가기
💻 OnlineJudge/Baekjoon

[백준 / BOJ] C++ 2096 내려가기

2022. 11. 28. 15:55

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

풀이

사실 한번 살펴보면 간단한 문제이다.

dp 문제들에 익숙해지면 조건식을 바로 알아챌 수 있다.

 

1. 별표 문양이 왼쪽에 있을 경우

dp[i][0] = arr[i][0] + max(dp[i - 1][0], dp[i - 1][1]); 
2. 별표 문양이 중앙에 있을 경우 
dp[i][1] = arr[i][1] + max(max(dp[i - 1][0], dp[i - 1][1]), dp[i - 1][2]); 
3. 별표 문양이 오른쪽에 있을 경우
dp[i][2] = arr[i][2] + max(dp[i - 1][1], dp[i - 1][2]);

 

이 세가지 조건을 이용하여 문제를 쉽게 해결할 수 있다.

 

아래 코드를 확인해보자.

 

Code ( C++ )

#include <iostream>
#include <algorithm>
using namespace std;

int N;
int arr[3];
int max_dp[2][3] = {0,};
int min_dp[2][3] = {0,}; 

int main()
{
    cin >> N;

    for(int i = 0; i < N; i++)
    {
        cin >> arr[0] >> arr[1] >> arr[2];
        
        if(i == 0)
        {
            max_dp[0][0] = min_dp[0][0] = arr[0];
            max_dp[0][1] = min_dp[0][1] = arr[1];
            max_dp[0][2] = min_dp[0][2] = arr[2];
            continue;
        }

        max_dp[1][0] = arr[0] + max(max_dp[0][0], max_dp[0][1]);
        max_dp[1][1] = arr[1] + max(max(max_dp[0][0], max_dp[0][1]), max_dp[0][2]);
        max_dp[1][2] = arr[2] + max(max_dp[0][1], max_dp[0][2]);

        max_dp[0][0] = max_dp[1][0];
        max_dp[0][1] = max_dp[1][1];
        max_dp[0][2] = max_dp[1][2];

        min_dp[1][0] = arr[0] + min(min_dp[0][0], min_dp[0][1]);
        min_dp[1][1] = arr[1] + min(min(min_dp[0][0], min_dp[0][1]), min_dp[0][2]);
        min_dp[1][2] = arr[2] + min(min_dp[0][1], min_dp[0][2]);

        min_dp[0][0] = min_dp[1][0];
        min_dp[0][1] = min_dp[1][1];
        min_dp[0][2] = min_dp[1][2];
    }

    cout << max(max(max_dp[0][0], max_dp[0][1]), max_dp[0][2]) << ' ' << min(min(min_dp[0][0], min_dp[0][1]), min_dp[0][2]) << endl;
}

'💻 OnlineJudge > Baekjoon' 카테고리의 다른 글

[백준 / BOJ] C++ 2448 별찍기 - 11  (0) 2022.12.07
[백준 / BOJ] C++ 2407 조합  (0) 2022.12.07
[백준 / BOJ] C++ 1991 트리 순회  (0) 2022.11.27
[백준 / BOJ] C++ 1967 트리의 지름  (0) 2022.11.25
[백준 / BOJ] C++ 1932 정수 삼각형  (0) 2022.11.25
    '💻 OnlineJudge/Baekjoon' 카테고리의 다른 글
    • [백준 / BOJ] C++ 2448 별찍기 - 11
    • [백준 / BOJ] C++ 2407 조합
    • [백준 / BOJ] C++ 1991 트리 순회
    • [백준 / BOJ] C++ 1967 트리의 지름
    스쳐가는비
    스쳐가는비
    The biggest risk is not taking any risk

    티스토리툴바