계단오르기

Program Lang./Algorithm 2017. 10. 25. 16:53

1. 소스 코드

백준 https://www.acmicpc.net/problem/2579 문제 정리. 

아래 코드는 완전 탐색으로 구현해 보았다. 완전 탐색도 조건이 계단 오르기 전과 오른 후에 연속해서 한 계단씩 오르는 조건이 달라서 코드가 지저분해졌다. 맞게 구현했는지도 솔직히 모르겠다. 두 가지 가능성에 대해서 TC로 돌려봤는데 생각하는데로 나오기는 했는데.


[완전 탐색]


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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
 
int max = -1;
bool first = true;
 
#ifdef TEST_BY_TC
int N = 6;
int data[302] = {0, 10, 20, 15, 25, 10, 20};
//int data[302] = {0, 5, 30, 30, 5, 20, 30};
#else
int data[302];
int N;
#endif
 
void f(int d, int c, int v)
{  
    //std::printf("d = %d, c = %d v = %d, data = %d \n", d, c, v, data[d]);
     
    if(d == N+1)
    {
        if(max < v)
        {
            max = v;
        }
        std::cout << "arrived ." << std::endl;
        return;
    }
  
    if(d > N+1)
    {
        std::cout << "out of range" << std::endl;
        return;
    }
     
    // 계단을 오르기 전의 경우 대응
    if(c == 3 && first == true)
    {
       std::cout << "continuous _1 ." << std::endl;
        first = false;
       return;       
    }
 
    // 계단을 오른 후에 경우 대응
    if(c == 2 && first == false)
    {
       std::cout << "continuous 1 ." << std::endl;
       return;       
    
 
    f(d+1, c+1, v + data[d]);
    f(d+2, 0, v + data[d]);
}
 
int main()
{
#ifndef TEST_BY_TC
    int n;
    std::cin >> n;
    N = n+1;
 
    for(int i = 1; i < N; i++)
    {
        std::cin >> data[i];
    }
#endif   
    f(0, 0, 0);
 
    std::cout << "max : " << max << std::endl;
    return 0;
}


2. DP 코드

처음에는 완전 탐색에서 더 탐색하지 않아도 되는 가지를 쳐 낼려고 했는데, 아무리 노력해도 되지 않아서 풀이를 찾기 시작했다. 풀이나 코드를 보고도 이해가 잘 안되었는데, 딱 이해를 할 수 있도록 정리하신 분이 있다.

따라서 아래 링크를 걸어 둔다.


[DP Code]


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
#include <iostream>
 
int stair[301];
int dp[301];
 
int main()
{
    int N;
 
    std::cin >> N;
 
    for(int i = 0; i < N; i++)
    {
        std::cin >> stair[i];
    }
 
    dp[0] = stair[0];
    dp[1] = std::max(stair[0] + stair[1], stair[1]);
    dp[2] = std::max(stair[0] + stair[2], stair[1] + stair[2]);
 
    for(int i = 3; i < N; i++)
    {
        dp[i] = std::max(dp[i-2] + stair[i], dp[i-3] + stair[i-1] + stair[i]);
    }
 
    std::cout << dp[N - 1] << std::endl;
 
    return 0;
}


[출처] http://kwanghyuk.tistory.com/4

'Program Lang. > Algorithm' 카테고리의 다른 글

위상정렬 (Topological Sort) - Indegree  (0) 2017.11.06
1로 만들기  (0) 2017.10.26
숫자삼각형 문제풀이  (0) 2017.10.25
RGB 거리  (0) 2017.10.22
요일 구하기  (0) 2017.10.22
: