본문으로 바로가기

백준 02579 - 계단 오르기

category BOJ 백준/Dynamic Programming 2020. 10. 23. 01:52

출처 : www.acmicpc.net/problem/2579

 

고려사항

- cnt 는 연속해서 도달했던 층들의 길이이다. 즉 memo[n][2] 는 memo[n-1][1] 에서 한 칸 이동,

memo[n][1] 은 memo[n-2][ ] 층에서 두 칸 이동해서 n 번째 계단에 도달했다는 뜻.

- cnt == 2 인 경우는 memo[n-1][1] + score[n]

- cnt == 1 인 경우는 memo[n-2][1] 와  memo[n-2][2] 중 큰 값 + score[n]

- 기저 사례에 2층도 포함되며 cnt == 2  이라면 1,2 층의 합, cnt == 1 이라면 시작부터 두칸 이동한 경우!

 

 

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

int score[301];
int memo[301][3];

int dp(int num, int cnt){
    int &v = memo[num][cnt];
    if(num == 1){
        v = score[1];
        return v;
    }

    if(num == 2){
        if(cnt == 1){
            v = score[2];
        }else if(cnt == 2){
            v = score[1] + score[2];
        }

        return v;
    }

    if(v != -1){
        return v;
    }

    if(cnt == 1){
        v = max(dp(num-2, 1), dp(num-2, 2)) + score[num];
    }else{
        v = dp(num-1,1) + score[num];
    }

    return v;
}

int main() {
    int n, ans;
    cin>>n;
    for(int i=1;i<=n;++i){
        cin>>score[i];
    }

    memset(memo,-1,301*3*4);
    ans = max(dp(n, 1),dp(n, 2));

    cout<<ans;
    return 0;
}

'BOJ 백준 > Dynamic Programming' 카테고리의 다른 글

백준 11053 - 가장 긴 증가하는 부분 수열  (0) 2020.10.23
백준 09251 - LCS  (0) 2020.10.23
백준 01912 - 연속합  (0) 2020.10.23
백준 01932 - 정수 삼각형  (0) 2020.10.23
백준 01149 - RGB거리  (0) 2020.10.23