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