코딩테스트준비/다시볼문제

백준 2579. 계단 오르기 (DP)

haeullee 2023. 7. 9. 20:18

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

 

2579번: 계단 오르기

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

www.acmicpc.net

문제 풀이는 바킹독의 실전 알고리즘 0x10강 - 다이나믹 프로그래밍을 참고했다. 

 

1. 특징

1) DP

 

2. 구현 포인트(DP문제)

1) 테이블 정의하기

D[i][j] = 현재까지 j개의 계단을 연속해서 밟고 i번째 계단까지 올라섰을 때 점수 합의 최댓값, 단 i번째 계단은 반드시 밟아야 함

 

2) 점화식 찾기

D[k][1] = max(D[k-2][1] + D[k-2][2]) + S[k]

D[k][2] = D[k-1][1] + S[k]

 

3) 초기값 정하기

D[1][1] = S[1], D[1][2] = 0

D[2][1] = S[2], D[2][2] = S[1] + S[2]

 

3. 코드

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

int n;
int arr[304];
int ans[304][3];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

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

    ans[1][1] = arr[1]; 
    ans[1][2] = 0;
    ans[2][1] = arr[2]; //두번째 전에서 온경우
    ans[2][2] = arr[1] + arr[2]; //첫번째 전에서 온경우
    for(int i = 3; i <= n; i++)
    {
        ans[i][1] = max(ans[i-2][1], ans[i-2][2]) + arr[i];
        ans[i][2] = ans[i-1][1] + arr[i];
    }

    cout << max(ans[n][1], ans[n][2]);
    

}