다이나믹 프로그래밍 연습문제
다이나믹 프로그램은 점화식 짜는 게 우선적으로 중요하기 때문에
좀 더 머리를 써야할 거 같다.
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 |