본문 바로가기

BOJ 2579 : 계단 오르기 본문

BOJ

BOJ 2579 : 계단 오르기

00rigin 2020. 3. 15. 22:53

먼저, 입력받은 값은 dp[0][n]에, 계산한 합은 dp[1][n]에 넣는다고 한다.

조건에 의해 마지막 계단은 꼭 밟아야 하므로, 상황을 2가지로 함축해 볼 수 있다.

 

1) 마지막 계단 과 그 전 계단을 밟을 경우

2) 마지막 계단과 그 전전 계단을 밟을 경우.

 

마지막 계단을 dp[0][n] 이라고 했을때, 연속된 3개의 계단을 밟을 수 없으므로,

 

1번의 상황에서는 dp[0][n-3]과 dp[0][n-1]을 밟았을 것이다. 즉,

dp[1][n] = dp[0][n] + dp[0][n-1] + dp[1][n-3]

 

2번의 상황에서는 dp[n-2] 만 밟고 올라왔을 것이다. 이때에는 dp[1][n-2] 까지는 n-2 일때 계산이 되어있을 것이므로

dp[1][n] = dp[0][n] + dp[1][n-2]

 

이 두개의 max 값을 비교하면 된다......

 

또한, n = 0~2일때는

dp[0][0] = dp[1][0]

dp[0][1] = dp[0][0] + dp[0][1]

dp[0][2] = dp[0][2]+max(dp[0][0], dp[0][1])

이다.

 

<소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
    int dp[2][301= { 0, };
    int n = 0;
    cin >> n;
    for (int i = 0; i <n; i++)
        cin >> dp[0][i];
    dp[1][0= dp[0][0];
    dp[1][1= dp[0][0+ dp[0][1];
    dp[1][2= max(dp[0][0+ dp[0][2], dp[0][1]+dp[0][2]);
    for (int i = 3; i < n; i++
        dp[1][i] = max(dp[0][i] + dp[0][i - 1+ dp[1][i - 3], dp[0][i] + dp[1][i - 2]);
    cout << dp[1][n - 1];
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

 

문제 :

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

 

2579번: 계단 오르기

계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점수를 얻게 된다. 예를 들어 <그림 2>와 같이 시작점에서부터 첫 번째, 두 번째, 네 번째, 여섯 번째 계단을 밟아 도착점에 도달하면 총 점수는 10 + 20 + 25 + 20 = 75점이 된다. 계단 오르는 데는 다음과 같은 규칙이 있다. 계단은 한 번에 한 계단씩

www.acmicpc.net

 

'BOJ' 카테고리의 다른 글

BOJ 1182번 : 부분수열의 합  (0) 2020.03.15
BOJ 1463번 : 1로 만들기  (0) 2020.03.15
BOJ 2163번 : 초콜릿 자르기  (0) 2020.03.15
BOJ 2293번 : 동전 1  (0) 2020.03.15
BOJ 1002번 : 터렛  (0) 2020.03.15
Comments