https://www.acmicpc.net/problem/17175
17175번: 피보나치는 지겨웡~
혁진이는 알고리즘 문제를 만들라는 독촉을 받아 스트레스다. 하지만 피보나치 문제는 너무 많이 봐서 지겹기 그지없다. 그러나 문제를 만들 시간이 없는 혁진이는 피보나치 문제를 응용해서 문제를 만들려 한다. int fibonacci(int n) { // 호출 if (n < 2) { return n; } return fibonacci(n-2) + fibonacci(n-1); } 위와 같이 코딩하였을 때 fibonacci(n)를 입력했을 때에 fibonacci
www.acmicpc.net
오랜만에 풀어본 dp문제였다. 피보나치를 물어 봤으니 반드시 dp로 풀어야 시간초과가 나지 않는다. 항상 염두할 것은 숫자가 커질수록 함수의 결과를 얻어내기까지 시간이 무척이나 오래 걸리기 때문에 그 점을 고려하여 미리 사용했던 결과를 이용해야 된다는 것이다. 결론은 dP문제는 규칙을 찾자!
#include <iostream>
using namespace std;
long long int dp[51];
//dp 설계, 0번째와 1번째는 1로 지정하고 나머지는 n - 2번째 + n - 1번째 + 1로 결과를 구한다.
int find_dp(int n) {
if (n == 0) {
dp[n] = 1;
return dp[n];
}
if (n == 1) {
dp[n] = 1;
return dp[n];
}
else {
dp[n] = (dp[n - 2] + dp[n - 1] + 1) % 1000000007; //전에 사용했던 값을 이용하여 도출, 숫자가 커질 수 있어 십억 칠로 나눈 나머지를 이용
return dp[n];
}
}
int main() {
int n;
cin >> n;
for (int i = 0; i <= 50; i++) { //0번째부터 50번째까지 결과를 구해야한다. 그래야 전에 구했던 값을 이용할 수 있다.
find_dp(i);
}
cout << dp[n]; //n번째 결과 출력
}
'백준' 카테고리의 다른 글
백준1339 - 단어 수학 (0) | 2019.08.13 |
---|---|
백준1436 - 영화감독 숌 (0) | 2019.08.12 |
백준7785 - 회사에 있는 사람 (0) | 2019.08.11 |
백준1051 - 숫자 정사각형 (0) | 2019.08.10 |
백준2941 - 크로아티아 알파벳 (0) | 2019.08.09 |