알고리즘 문제풀이/백준
[백준 2579] 계단 오르기
홍시홍
2020. 4. 9. 00:43
분류 : dp
요구사항
조건에 따라 계단을 올랏을 경우, n번째 계단에서의 최댓값 구하기
풀이
dp로 풀이한다
점화식을 구하여 top-down 방식으로 푼다
func(num) = max(map[num-1] + func(num-3) , func(num-2) + map[num]);
현재 자리의 최대값은
현재값 + 이전 값 + -3까지의 최대값
or
현재값 + -2까지의 최대값이다
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
int d[330];
int map[330];
int n;
int func(int num) {
if (num == 0)
return 0;
if (num < 0) return 0;
if (num == 1) return map[1];
int &ref = d[num];
if (ref != -1) return ref;
//int a = max(2, 3);
return ref = max( (map[num - 1]+ func(num - 3)), func(num - 2)) + map[num];
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", &map[i]);
d[i] = -1;
}
//d[1] = 10;
cout << func(n) << endl;
}