반응형
https://www.acmicpc.net/problem/1003
피보나치 함수는 대표적인 다이나믹프로그래밍 문제이다.
피보나치 함수는
f(0) = 0,
f(1) = 1,
n>=2, f(n) = f(n-1) + f(n-2)의 꼴이다.
위의 문제는 0이 나오는 횟수와 1이 나오는 횟수를 출력하는 것이다.
따라서
n=0: {1,0}
n=1: {0,1}
n=2: {1,1}
n=3: {1,2}
n=4: {2,3}
....
이렇게 이어진다. 위의 순서를 보고 규칙을 찾으면
n=i: {i-1 의 첫번째 원소 + i-2 의 첫번째 원소, i-1 의 두번째 원소 + i-2 의 두번째 원소}이다.
따라서 이에 맞게 함수를 작성하면
pair<int,int> fibo(int a) {
if (dp[a] != make_pair(0, 0)) return dp[a];
pair<int,int> fa1 = fibo(a - 1), fa2 = fibo(a - 2);
return dp[a] = make_pair(fa1.first + fa2.first, fa1.second + fa2.second);
}
라고 할수있다.
소스코드
#include <iostream>
#define pii pair<int,int>
using namespace std;
int T, a;
pii dp[41];
pii fibo(int a) {
if (dp[a] != make_pair(0, 0)) return dp[a];
pii fa1 = fibo(a - 1), fa2 = fibo(a - 2);
return dp[a] = make_pair(fa1.first + fa2.first, fa1.second + fa2.second);
}
int main() {
dp[0] = { 1,0 }, dp[1] = { 0,1 };
cin >> T;
while (T--) {
cin >> a;
pii ans = fibo(a);
cout << ans.first << ' ' << ans.second << '\n';
}
}
반응형
'백준 > 일반 문제' 카테고리의 다른 글
[백준/BOJ] 1463 - 1로 만들기 (c++) (DP) (0) | 2022.04.09 |
---|---|
[백준/BOJ] 11726 - 2×n 타일링 (c++) (DP) (0) | 2022.04.09 |
[백준/BOJ] 1149 - RGB거리 (c++) (DP) (0) | 2022.04.08 |
[백준/BOJ] 10815 - 숫자 카드 (c++) (이분탐색) (0) | 2022.04.08 |
[백준/BOJ] 21609 - 상어 중학교 (c++) (0) | 2022.04.07 |