티스토리 뷰

안녕하세요? 코딩충입니다.


오늘 풀이할 문제는 2579 계단 오르기 입니다. 









전형적인 점화식 DP의 형태이고요 KOI 기출이라서 소개 하려고 합니다.

문제를 딱 보면 눈에 띄이는 문장은 규칙#1 계단은 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다. 입니다.


피보나치 점화식[각주:1]이 딱 생각나는 부분입니다.

하지만 규칙#2를 보면 왜 이 문제가 정답률이 30%대인지 알 수 있습니다.

연속해서 3계단을 밟을 수는 없다는 것이지요!

따라서 피보나치 점화식에서 조금은 바꾸어서 저 경우를 처리하지 않도록 점화식을 세워야 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int N, a[302], d[302][5];
int f(int n, int m) {
    if (m >= 3)return -100001;
    if (n == N)return a[n];
    if (n > N)return -100001;
    if (d[n][m] != -1)return d[n][m];
    d[n][m] = f(n + 1, m + 1+ a[n];
    d[n][m] = max(f(n + 21+ a[n], d[n][m]);
    return d[n][m];
 
}
int main() {
    scanf("%d"&N);
    memset(d, -1sizeof(d));
    for (int i = 1; i <= N; i++) {
        scanf("%d"&a[i]);
    }
    printf("%d", f(0,0));
    return 0;
}
cs


  1. D[n] = D[n - 1] + D[n - 2], D[0] = D[1] = 1 [본문으로]
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함