일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- BFS
- Unity
- programmers
- 프로세스 상태
- 3D RPG
- Bronze
- level3
- PrefixSum
- effective C++
- 8-Puzzle
- Flyweight Pattern
- 프로그래머스
- knapsack Problem
- BOJ
- Modern C++
- Euclidean
- SWEA
- trie
- binary search
- LEVEL2
- two pointer
- Gold
- solid 원칙
- algorithm
- level1
- dirtyflag pattern
- Zenject
- Project
- Silver
- stack
Archives
- Today
- Total
Patrick's Devlog
[BOJ/C++] 피보나치 함수(1003번) 본문
1. 개요
https://www.acmicpc.net/problem/1003
1-1. 설명
N번째 피보나치를 구하게 된다면 재귀를 통해 0부터 N의 피보나치 값들이 구해지게 될 것이다. 여기서 fibonacci(N) 함수를 호출했을 때, 0과 1이 각각 몇번 출력되는지 구하는 프로그램을 작성한다.
1-2. 제한 사항
- 첫 줄에 테스트 케이스 개수 T가 주어짐
- 각 테스트 케이스는 한줄로 이루어져 있으며, N이 주어짐
- N은 40 이하 자연수 or 0
2. 구현
2-1. 풀이
DP의 bottom-up 방식을 이용해 풀어야겠다고 생각했다. 간략하게 표를 살펴보자
위의 표처럼 0과 1의 개수를 나타낼 수 있다. 여기서 그럼 점화식은 dp[i] = dp[i-1] + dp[i-2] 임을 알 수 있다. 이전값 2개를 더해 현재값을 구하면 된다.
2-2. 코드
#include <iostream>
#include <algorithm>
using namespace std;
int dp[41][2];
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int T, num;
cin >> T;
dp[0][0] = 1, dp[1][1] = 1;
int index = 2;
for (int tc = 0; tc < T; tc++) {
cin >> num;
if (num >= 2) {
for (int i = index; i <= num; i++) {
dp[i][0] = dp[i - 1][0] + dp[i - 2][0];
dp[i][1] = dp[i - 1][1] + dp[i - 2][1];
}
index = num + 1;
}
cout << dp[num][0] << ' ' << dp[num][1] << "\n";
}
return 0;
}
'Algorithm > Algorithms Practice' 카테고리의 다른 글
[BOJ/C++] 주식(11501번) (0) | 2023.01.13 |
---|---|
[BOJ/C++] 촌수계산(2644번) (0) | 2023.01.12 |
[BOJ/C++] 줄세우기(10431번) (0) | 2023.01.09 |
[BOJ/C++] 절댓값 힙(11286번) (0) | 2023.01.06 |
[BOJ/C++] 랜선 자르기(1654번) (0) | 2023.01.05 |