Baekjoon Review
[Silver 3] 2579번 계단 오르기
hanseongbugi
2023. 11. 7. 12:23
https://www.acmicpc.net/problem/2579
2579번: 계단 오르기
계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점
www.acmicpc.net
이 문제는 Dynamic Programming을 사용해서 해결해야한다.
알고리즘은 다음과 같다.
- 계단은 1 step과 2 step으로 이동할 수 있다.
- dp[0]은 1번째 계단으로 한다. 또한 dp[1]은 2 step으로 이동했을 때와 1step으로 이동했을 때의 최대값으로 한다.
- dp[2]는 1번째 계단에서 2 step으로 이동했을 때와 2번째 계단에서 1step으로 이동했을 때의 최대값으로 한다.
위 알고리즘을 적용한다면 dp[N]은 max(N번째 계단 + N-2번째 계단, N번째 계단 + N -1 번째 계단 + N-3번째 계단) 이다.
- N-3이 되는 이유는 연속으로 3번 계단을 밟을 수 없기 때문이다.
- dp의 0, 1, 2번째 요소는 초기 계단을 밟을 수 있는 경우를 모두 저장한 것이다.
#include <iostream>
using namespace std;
#define MAX 301
int N;
int stairs[MAX];
int dp[MAX];
int main() {
cin >> N;
for(int i=0;i<N;i++)
cin >> stairs[i];
dp[0] = stairs[0];
dp[1] = max(stairs[1],stairs[0]+stairs[1]);
dp[2] = max(stairs[0] + stairs[2],stairs[1]+stairs[2]);
for(int i=3;i<N; i++)
dp[i] = max(stairs[i] + dp[i-2], stairs[i]+stairs[i-1] +dp[i-3]);
cout << dp[N-1];
}