본문 바로가기

알고리즘/BOJ

2579번

2579번 - 계단 오르기


D[N] = N번째 계단을 오르는 최대 값


N번째 계단을 오르는 방법은 조건에 따라 두가지가 된다.


1. N-2칸에서 2칸 점프하여 오르는 경우.

2. N-1칸에서 1칸 점프하여 오르는 경우.


하지만 2번째 경우일 때는 문제의 조건에 따라 연속된 3칸을 밟으면 안되므로

N-3칸에서 N-1칸으로 2칸 점프한후, N-1칸에서 N칸으로 1칸 점프해야 한다.

(N-2칸에서 N-1칸으로 1칸 점프한후, N-1칸에서 N칸으로 1칸 점프하는 경우 조건에 위배된다.)


따라서 D[N] = max(D[N-2]+stair[N] , D[N-3] + stair[N-1] + stair[N]) 이라는 점화식이 완성된다.


1달 전에 혼자 풀었을 때는 2차원 DP로 풀었는데 다시 풀어보니 그럴 필요까진 없었던 문제였다.





<정답 코드>


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
#include<iostream>
#include<algorithm>
using namespace std;
 
int N;
int stair[301];
int D[301];
int ans;
int go(int n)
{
    
    if(n<=0)
    {
        return 0;
    }
    if(n==1)
    {
        return stair[n];
    }
    if(D[n]!=0)
    {
        return D[n];
    }
   
    
    D[n]=max(go(n-2)+stair[n],go(n-3)+stair[n-1]+stair[n]);
    
    return D[n];
    
    
    
}
int main()
{
    cin>>N;
    for(int i=0;i<301;i++)
    {
        D[i]=0;
    }
    for(int i=1;i<=N;i++)
    {
        cin>>stair[i];
    }
    
    cout<<go(N)<<endl;
    return 0;
}
cs


<완전 탐색 코드 - 9%에서 시간 초과>


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
#include<iostream>
#include<algorithm>
using namespace std;
 
int N;
int stair[301];
int ans;
void go(int n,int sum)
{
    
    if(n<=0)
    {
        return;
    }
    if(n==1)
    {
        return ;
    }
    
    ans=max(ans,sum);
    
    go(n-2,sum+stair[n]);
    go(n-3,sum+stair[n]+stair[n-1]);
    
    return;
    
    
    
}
int main()
{
    cin>>N;
    for(int i=1;i<=N;i++)
    {
        cin>>stair[i];
    }
    
    go(N,0);
    
    cout<<ans<<endl;
    return 0;
}
cs


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

2133번  (0) 2017.11.21
1699번  (0) 2017.11.21
1912번  (0) 2017.11.18
11054번  (0) 2017.11.18
11722번  (0) 2017.11.18