오늘의 알고리즘

[C++] 백준 2579번 계단오르기

하늘하늘 . 2022. 5. 2. 19:40
 
#include <iostream>
#include <queue>
#include <tuple>
 
int stair[301] = {};
int DP[301] = {};
 
int main()
{
    int N = 0;
    std::cin >> N;
 
    int iCount = 0;
    stair[0] = 0;
 
    for (int i = 1; i <= N; ++i)
    {
        std::cin >> stair[i];
    }
 
    DP[1] = stair[1]; 
    DP[2] = std::max(stair[2], stair[1] + stair[2]);
    DP[3] = std::max(stair[1] + stair[3], stair[2] + stair[3]);
 
    for (auto i = 4; i <= N; ++i)
    {
        DP[i] = std::max(stair[i] + DP[i - 2], stair[i] + stair[i - 1] + DP[i - 3]);
    }
 
    std::cout << DP[N];
 
    return 0;
}

이번 코테에서 DP문제에 고배를 써서 DP문제를 많이 풀어봐야겠다고 생각해서 풀었다.

que로 했더니 메모리 초과.. 

최대 두칸이고, 그 뒤로는 두칸 위로 올라가야하는건데...

접근하는 방법을 생각하는 게 어려웠다.

어떤 한 칸에 들어가는 방법이

 

2칸 전(DP) + (점프 후)올라왔을 때의 칸,

3칸 전(DP) + (점프 후)1칸 전 + 올라왔을 때의 칸 

 

이렇게 두 방법을 비교해서 풀어야 했다.