본문 바로가기

백준

백준17175 - 피보나치는 지겨웡~

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