-

2579 계단오르기 본문

Algorithm/Baekjoon

2579 계단오르기

Boogallee 2018. 1. 30. 17:35



점화식으로 바로 접근해서 헷갈리는 부분이 많았다.


D[n] = Max(D[n-2),D(n-1) + S(n) 이런 형식을 가지고만 생각하면 풀기 너무 어려워진다.



경우의 수를 나누어야 한다.


제일 마지막 계단은 무조건 밟아야 하는 것과 세번 연속 오를 수 없다는 것을 기준으로 경우를 나눠야 한다.


두가지 경우로 나누어 생각.


즉,  점화식을 세울 때


O X O O  --> D[n-3] + S[n-1] + S[n] // 전전전칸까의 최대값 + 전계단 + 마지막 계단


? O X O   --> D[n-2] + S[n]  // 전전칸까지의 최대값 + 마지막 계단



코드:


#include <iostream>



/*

계단은 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다. 즉, 한 계단을 밟으면서 이어서 다음 계단이나, 다음 다음 계단으로 오를 수 있다.

연속된 세 개의 계단을 모두 밟아서는 안된다. 단, 시작점은 계단에 포함되지 않는다.

마지막 도착 계단은 반드시 밟아야 한다.

*/

using namespace std;


int S[301];

int D[301];

bool check[301];

int max(int a, int b){

return a > b ? a : b;

}

int main()

{


int N;

cin >> N;

for (int i = 0; i < N; i++)

{

cin >> S[i];

}

D[0] = S[0];  //1칸

D[1] = max(S[0] + S[1], S[1]);  //2칸올라가는 경우 -> 1+1 or 2칸 한번에

D[2] = max((S[0] + S[2]), (S[1] + S[2]));

for (int i = 3; i < N; i++)

{

D[i] = max((D[i - 2] + S[i]), (D[i - 3] + S[i-1] + S[i]));

}

cout << D[N-1];

system("pause");

return 0;

}


'Algorithm > Baekjoon' 카테고리의 다른 글

1005 ACM craft  (0) 2018.02.01
1463 1만들기  (0) 2018.01.30
1932 숫자삼각형  (0) 2018.01.30
1021 회전하는 큐[덱]  (0) 2018.01.17
1966 프린터 큐  (0) 2018.01.16
Comments