백준

백준 2579 C++

solfa 2024. 1. 31. 12:52

https://www.acmicpc.net/problem/2579

 

2579번: 계단 오르기

계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점

www.acmicpc.net

정답 코드

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

int main() {
    int N, arr[300], stair[300], dp[300] = {0};
    cin >> N;
    for(int i=0 ; i<N ; i++){
        cin >> arr[i];
    }

    for(int i=0 ; i<N ; i++){
        stair[i] = arr[i];
    }

    dp[0] = stair[0];
    dp[1] = max(stair[0] + stair[1], stair[1]);
    dp[2] = max(stair[0] + stair[2], stair[1] + stair[2]);

    for(int i=3 ; i<N ; i++){
        dp[i] = max(dp[i-2] + stair[i], dp[i-3] + stair[i-1] + stair[i]);
    }
    
    cout << dp[N-1];
}

 

stair 배열 -  계단의 점수 저장

dp 배열 - 각 계단까지의 최대 누적 점수를 저장

 

dp[0] - 첫 번째 계단까지의 최대 누적 점수로 초기화

dp[1] - 두 번째 계단까지의 최대 누적 점수로 초기화

dp[2] - 세 번째 계단까지의 최대 누적 점수로 초기화

 

초기화 세 번을 하면 dp[3] ~ dp[N-1]을 계산해줄 차례!

 

점화식

        dp[i] = max(dp[i-2] + stair[i], dp[i-3] + stair[i-1] + stair[i]);

 

dp[i] - i번째 계단까지의 최대 누적 점수는 max(dp[i-2] + stair[i], dp[i-3] + stair[i-1] + stair[i])

dp[i-2] + stair[i] - i번째 계단을 밟을 경우, 이전 계단(i-1번째 계단)은 밟지 않은 상태여야 함

dp[i-3] + stair[i-1] + stair[i] - i번째 계단을 밟을 경우, 이전 계단(i-2번째 계단)은 밟은 상태여야 하며, 그 이전 계단(i-3번째 계단)은 어떤 경우이든 상관 없음

 
 
 
728x90

'백준' 카테고리의 다른 글

백준 1965 C++  (1) 2024.02.13
백준 2631 C++  (0) 2024.02.13
백준 1789 C++ 시간초과  (2) 2024.01.31
백준 10816 C++  (0) 2023.12.27
백준 5622 C++  (1) 2023.12.26