본문 바로가기

PS/백준

[백준 2579번] 계단 오르기 C++

728x90

www.acmicpc.net/problem/2579

 

2579번: 계단 오르기

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

www.acmicpc.net

0층부터 올라가는 구조로 탑다운으로 풀고있었는데 풀면서 느꼈다.

문제 조건상 무조건 마지막 계단을 밟아야되는데

이렇게 마지막이 확정된 경우라면 마지막계단 우선 밟고 내려가는 구조로 바텀업방식 알고리즘이 무조건 쉬울거라고..

 

 

근데 일단 오기가 생겼고 탑다운도 가능할거라 생각해서 탑다운으로도 풀었다(오래걸렸다)

 

확실히 바텀업이 코드도짧고 직관적임

 

 

 

탑다운풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
int arr[303];
int dp[303][3];
 
int stair(int x, int cnt) {
 
    if (x == n) return arr[n];
    //목적지를 넘어서면 아주 큰 음수를 줘서 답이 못 되게 
    if (x == n + 1return -100000000;
 
    int& ret = dp[x][cnt];
    if (ret != -1return ret;
 
 
    //한번에 연속된 3칸은 밟을 수 없음    
    if (cnt == 2return ret = arr[x] + stair(x + 21);
    return ret = arr[x] + max(stair(x + 1, cnt + 1), stair(x + 21));
 
}
int main() {
 
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> arr[i];
 
    memset(dp, -1sizeof(dp));
    cout << stair(00);
 
    return 0;
}
cs

 

 

바텀업

애초에 반복문 조건이 n까지이기 때문에

마지막 계단을 안 밟고 n을 넘어서는걸 생각할 필요가 없다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
int arr[303];
int dp[303][3];
 
int main() {
 
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> arr[i];
 
    for (int i = 1; i <= n; i++) {
        dp[i][1= arr[i] + max(dp[i - 2][1], dp[i - 2][2]);
        dp[i][2= arr[i] + dp[i - 1][1];
    }
    cout <<max(dp[n][1], dp[n][2]);
    
 
    return 0;
}
cs
728x90

'PS > 백준' 카테고리의 다른 글

[백준 2156번] 포도주 시식 c++  (0) 2021.05.13
[백준 10844번] 쉬운 계단 수 C++  (0) 2021.05.13
[백준 1932번] 정수 삼각형 c++  (0) 2021.05.12
[백준 1149번] RGB거리 C++  (0) 2021.05.12
[백준 9461번] 파도반 수열 c++  (0) 2021.05.12