백준 1737번, Pibonacci 풀이
2020. 11. 1. 16:41ㆍProblem Solving/백준
문제
풀이
기본적인 피보나치 문제도 DP이기 때문에, DP를 사용하는 문제임에는 쉽게 알 수 있습니다.
다만, 소수점 오차 때문에 dp table을 잡기가 조금 애매합니다.
소수점 오차를 줄이기 위해서 $ n $에서 뺄 1의 개수와 $ \pi $의 개수를 기록하여 dp table을 채우면 될 것 같습니다.
$ dp[i][j] = f(n - i - \pi j) $라고 두고 재귀 함수로 풀었습니다. (단, $ f $는 Pibonacci 함수)
소스코드
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
ull MOD = 1000000000000000000;
ull dp[1001][1001];
long double n;
ull solve(int i, int j) {
long double curr = n - 1 * i - M_PI * (long double)j;
if (0 <= curr && curr <= M_PI) return 1;
else if (curr < 0) return 0;
if (dp[i][j]) return dp[i][j];
return dp[i][j] = (solve(i + 1, j) + solve(i, j + 1)) % MOD;
}
int main() {
cin >> n;
cout << solve(0, 0);
}
'Problem Solving > 백준' 카테고리의 다른 글
백준 2110번, 공유기 설치 풀이 (0) | 2020.11.15 |
---|---|
백준 1083번, 소트 풀이 (0) | 2020.11.10 |
백준 16074번, Mountaineers 풀이 (0) | 2020.10.25 |
백준 9694번, 무엇을 아느냐가 아니라 누구를 아느냐가 문제다 풀이 (0) | 2020.10.16 |
백준 17612번, 한국정보올림피아드 KOI 2019년 1차 대회 고등부 1번, 쇼핑몰 풀이 (0) | 2020.10.15 |