μ νΌλ³΄λμΉλ€! CPP μ½λλ 쀬λ€? μ μλ³μ μ¨μ λνλ©΄ λμμ νκ³ νλ€κ° λκ° μ΄μν¨μ κ°μ§νμ΅λλ€. κ²λ€κ° λΌμ΄λΈλ¬λ¦¬ λ¬Έμ λ‘ μ»΄νμΌ μλ¬λ λ¬μ΅λλ€. λμ€μ μλλλ‘ μμ ν΄ λ³΄λ μμ μκ°μ΄κ³Όμ λλ€.
#include <iostream>
int zeros, ones;
int fibonacci(int n) {
if (n == 0) { zeros++;return 0;}
else if (n == 1) {ones++;return 1;}
else {return fibonacci(n - 1) + fibonacci(n - 2);}}
int main() {
int numberOfLines; std::cin >> numberOfLines;
for (int i = 0; i < numberOfLines; ++i) {
int number;
std::cin >> number;
zeros = 0;ones = 0;
fibonacci(number);
std::cout << zeros << " " << ones << std::endl;}
return 0;}
μ€ν°λμμ λμ νλ‘κ·Έλλ°μ νμ©ν΄μ νμ΄μΌ νλ€λ κ²μ λ£κ³ λμμΌ λ¬Έμ λ₯Ό μ΄ν΄νκ³ ,
λ°λ³΅λλ κ³μ°μμ μ΄λ―Έ ꡬν κ°μ μ μ₯ν΄μ μ¬μ©νλ κ²μΌλ‘ μ΄ν΄νμ΅λλ€.
κ·Έλ¦¬κ³ νμ΄μ¬μΌλ‘ λ°κΎΈμμ΅λλ€.
import sys
nums = [int(n.rstrip()) for n in sys.stdin.readlines()[1:]]#μ
λ ₯ μ½κΈ°(λ°μ΄ν° μ λ²λ¦Ό)
max_num = max(nums) #μ
λ ₯λ μ μ€ μ΅λκ° μ°ΎκΈ°
dp = [(1, 0),(0, 1)] # f(1)κ³Ό f(2)μ λν κΈ°λ³Έκ° μ μ₯
if max_num>1: # μ΅λκ°μ΄ κΈ°λ³Έκ° μ΄μμ΄λ©΄ ν΄λΉ κ°κΉμ§ μμ΄(0κ³Ό 1μ λ±μ₯ νμ μμ΄) μΆκ°
for i in range(2, max_num+1):
dp.append((dp[i-1][0] + dp[i-2][0], dp[i-1][1] + dp[i-2][1]))
for n in nums: # μμ±λ κ°μ κΊΌλ΄ μ΄λ€.
print(dp[n][0], dp[n][1])
μ΄ λ¬Έμ μμλ κ³μ°ν μ«μκ° νκΊΌλ²μ μ£Όμ΄μ§λ μ μ μ΄μ©ν΄μ ν λ²μ μ λ ₯μ λ°κ³
μ΅λκ°μ μ°Ύμ λ€ μ΅λκ°μ λν΄ μ°μ°νλ©΄μ dp λ³μμ μ°μ° κ²°κ³Όλ₯Ό μ μ₯νκ³
κ·Έκ²μ κΊΌλ΄μ΄ μ°λ μμΌλ‘ ν΄κ²°νμ΅λλ€.
μ΄λ° λμ νλ‘κ·Έλλ°μλ μν₯μκ³Ό νν₯μμ΄ μμ΅λλ€.
μν₯μ(Bottom-Up):Β κ°μ₯ μμ νμ λ¬Έμ λΆν° μμνμ¬ μ μ°¨ ν° λ¬Έμ λ‘ νμ₯ν΄ λκ°λ©°, κ° λ¨κ³μ κ²°κ³Όλ₯Ό μ μ₯ν©λλ€. μλμμ case 0κ³Ό case1μ 미리 ν΄κ²°ν΄μ μ£Όμ΄μ Έ μμ΅λλ€. λ€μμλ μ΄ κ°μ μ΄μ©ν΄ λ€μ λ¬Έμ λ₯Ό νμ΄κ°λ μμΌλ‘ μ¬κ· λμ λ°λ³΅λ¬ΈμΌλ‘ λΉ λ₯΄κ² ν΄κ²°ν©λλ€.
dp = [(1, 0),(0, 1)] #μ΄κΈ°μ κ°λ¨ν λ¬Έμ λ‘ μΆλ°
for i in range(2, max_num+1):
dp.append((dp[i-1][0] + dp[i-2][0], dp[i-1][1] + dp[i-2][1]))
μ λΆλΆμμλ ν΄κ²°λ κΈ°λ³Έ λ¬Έμ λ₯Ό λ°νμΌλ‘ μ μ ν° λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€. μ¬κ·λ‘ νΈλ λμ μ νμμ μν λ°λ³΅λ¬ΈμΌλ‘ μ μ 볡μ‘ν λ΅μ ꡬνκ³ κ·Έ κ³Όμ μμ dpνκ° μμ±λ©λλ€. 4λ₯Ό μλ‘ λ€λ©΄, μλμ²λΌ λ¬Έμ λ₯Ό μ°¨λ‘λ‘ νλ©° μμ΄μ΄ μμ±λ©λλ€.
dp[2] = (dp[1][0] + dp[0][0], dp[1][1] + dp[0][1]) = (1+0,0+1) = (1, 1)
dp[3] = (dp[2][0] + dp[1][0], dp[2][1] + dp[1][1]) = (1+1,1+1) = (1, 2)
dp[4] = (dp[3][0] + dp[2][0], dp[3][1] + dp[2][1]) = (1+1,2+1) = (2, 3)
νν₯μ μ κ·Ό : λ¨Όμ λ¬Έμ λ₯Ό νλ©΄μ λ©λͺ¨νκ³ , κ·Έ κ³Όμ μμ μμ±λ λΆλΆ λ¬Έμ μ κ²°κ³Όλ₯Ό μ΄μ©νλ κ²μ΄ νν₯μ μ κ·Όμ λλ€.
def fibonacci(n, dp):
if n in dp:
return dp[n]
if n == 0:
dp[n] = (1, 0)
return dp[n]
elif n == 1:
dp[n] = (0, 1)
return dp[n]
else:
a, b = fibonacci(n-1, dp)
c, d = fibonacci(n-2, dp)
dp[n] = (a + c, b + d)
return dp[n]
nums = [int(input().strip()) for _ in range(int(input()))]
dp = {}
for n in nums:
print(*fibonacci(n, dp))
λ©λͺ¨μ΄μ μ΄μ (Memoization):
DPμ λ©λͺ¨μ΄μ μ΄μ μ μ°¨μ΄λ₯Ό μ±μ§νΌν°νν λ¬ΌμΌλ λΉμ·νλ° λ€λ₯΄λ€κ³ ν΄μ κ²μμ ν΄ λ΄€μ΅λλ€.
| Bottom up μν₯μ | Top down νν₯μ |
|---|---|
| forλ‘ κ΅¬ν | μ¬κ·ν¨μλ‘ κ΅¬ν |
| μμ λ¬Έμ λ₯Ό λͺ¨μ ν° λ¬Έμ ν΄κ²° | ν° λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μμ μ¬κ· ν¨μ νΈμΆ |
| μ νμ νμ | μ νμ νμ |
| λ©λͺ¨μ΄μ μ΄μ μμ | λ©λͺ¨μ΄μ μ΄μ = μΊμ±κ²°κ³Ό μ μ₯μ© λ¦¬μ€νΈλ μ¬μ μ DP ν μ΄λΈμ΄λΌ ν¨. |
| μ€λ²ν€λλ₯Ό μ€μΌ μ μλ€. μΌλ°μ μΌλ‘ μ±λ₯μ΄ λ μ’λ€. | **μ€λ²ν€λ κ°λ₯μ±μ΄ μλ€. |
| (μλ§λ 1,4,5,7,10μ²λΌ ν΄κ²°ν λλ₯Ό λ§νλ κ² κ°μ΅λλ€.)** |
<ν μλ¬Έ μΆμ²: https://chae52.tistory.com/206> μΌλΆ μμ
νλ₯Ό 보λ€λ³΄λ κ·ΈλΌ dp ν μ΄λΈκ³Ό λ©λͺ¨μ΄μ μ΄μ μ κ°μ건κ°? νλ μκ°μ΄ λ€μ΄ μκ² λ¬Όμ΄λ³΄λ λ λ€λ₯΄λ΅λλ€. λ―Έμ¬μ©μ΄μ μ°Ύμ보λ μ€ν μ€λ²νλ‘μ κ΄λ ¨ μ£Όμ κ° (λΉμ°ν) μμ΅λλ€.
λ©λͺ¨μ΄μ μ΄μ κ³Ό λμ νλ‘κ·Έλλ°μ μ°¨μ΄μ μ 무μμ λκΉ?