본문 바로가기

BOJ

백준 15990 / 1,2,3 더하기 5


다이나믹 프로그래밍 연습문제


다이나믹 프로그램은 점화식 짜는 게 우선적으로 중요하기 때문에


좀 더 머리를 써야할 거 같다.




n을 완성하는 수식 중 i로 끝나는 식을 ans[n][i]라 하면


1,2,3 더하기의 점화식은


ans[i][1] = ans[i - 1][2] + ans[i - 1][3]

ans[i][2] = ans[i - 2][1] + ans[i - 2][3]

ans[i][3] = ans[i - 3][1] + ans[i - 3][2]




소스코드는


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
#include <stdio.h>
#include <iostream>
#include <vector>
 
using namespace std;
 
long long ans[100001][4];
 
int main() {
    int tastcase;
 
    cin >> tastcase;
 
    ans[0][1= 0;
    ans[0][2= 0;
    ans[0][3= 0;
 
    ans[1][1= 1;
    ans[1][2= 0;
    ans[1][3= 0;
 
    ans[2][1= 0;
    ans[2][2= 1;
    ans[2][3= 0;
 
    ans[3][1= 1;
    ans[3][2= 1;
    ans[3][3= 1;
 
    for (int i = 4; i <= 100000; i++) {
 
        ans[i][1= (ans[i - 1][2+ ans[i - 1][3]) % 1000000009;
        ans[i][2= (ans[i - 2][1+ ans[i - 2][3]) % 1000000009;
        ans[i][3= (ans[i - 3][1+ ans[i - 3][2]) % 1000000009;
 
    }
 
    while (tastcase--) {
 
        int n;
 
        cin >> n;
        
        cout<< (ans[n][1+ ans[n][2+ ans[n][3]) % 1000000009 <<endl;
 
        
    }
 
}
cs



'BOJ' 카테고리의 다른 글

백준 14002 / 가장 긴 증가하는 부분 수열 4  (0) 2018.12.27
백준 11053 / 가장 긴 증가하는 부분 수열  (0) 2018.12.26
백준 1463 / 1로 만들기  (0) 2018.12.20
백준 3055 / 탈출  (0) 2018.12.20
백준 14502 / 연구소  (0) 2018.12.19