문제: 백준 2579 (c++)

Image

Image

Image

풀이과정

이 문제는 조건이 조금 까다롭다고 느낄 수 있다.

계단이 네 개가 있다고 가정을 했을 때, 계단 1, 2는 무조건 한 칸씩 가는 것이 최댓값을 구할 때 도움이 된다.

따라서 dp 배열에 먼저 값을 지정해 주었고,

세 번째 계단은 애초에 문제 조건에 연속 세 계단을 밟을 수 없다고 되어 있기에

한 칸, 두 칸 또는 두 칸, 한 칸으로 계단을 밟아야 한다.


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

int main(){

    int dp[301] ;
    int a[301] ;
    int n ;
    int cnt = 0 ;

    cin >> n ;

    for(int i = 1; i <= n; i++){
        cin >> a[i] ;
    }

    dp[1] = a[1] ;
    dp[2] = a[1] + a[2] ;
    dp[3] = a[3] + max(a[1], a[2]) ;

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



Image

따라서 이렇게 max 함수를 이용하여 세 번째 계단을 지정해 주었다.

그 후의 계단부터는 Bottom-up 방식을 이용하여 풀어주었다.


Image

코드를 보면 알 수 있듯이 두 가지 경우를 나누어 max 함수를 이용해 최댓값을 구할 수 있도록 해주었다.

주의할 점은 무조건 dp 배열을 더하는 것이 아닌 원래 계단의 점수를 입력받았던 배열을 더해야 한다는 것이다.



Image

Tags:

Categories:

Updated:

Leave a comment