1003번: ν”Όλ³΄λ‚˜μΉ˜ ν•¨μˆ˜

와 ν”Όλ³΄λ‚˜μΉ˜λ‹€! 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;}

Dynamic Programming, Memoization

μŠ€ν„°λ””μ—μ„œ 동적 ν”„λ‘œκ·Έλž˜λ°μ„ ν™œμš©ν•΄μ„œ ν’€μ–΄μ•Ό ν•œλ‹€λŠ” 것을 λ“£κ³  λ‚˜μ„œμ•Ό 문제λ₯Ό μ΄ν•΄ν–ˆκ³ ,

λ°˜λ³΅λ˜λŠ” κ³„μ‚°μ—μ„œ 이미 κ΅¬ν•œ 값은 μ €μž₯ν•΄μ„œ μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ μ΄ν•΄ν–ˆμŠ΅λ‹ˆλ‹€.

그리고 파이썬으둜 λ°”κΎΈμ—ˆμŠ΅λ‹ˆλ‹€.

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 λ³€μˆ˜μ— μ—°μ‚° κ²°κ³Όλ₯Ό μ €μž₯ν•˜κ³ 

그것을 κΊΌλ‚΄μ–΄ μ“°λŠ” μ‹μœΌλ‘œ ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

이런 동적 ν”„λ‘œκ·Έλž˜λ°μ—λŠ” 상ν–₯식과 ν•˜ν–₯식이 μžˆμŠ΅λ‹ˆλ‹€.

DP와 λ©”λͺ¨μ΄μ œμ΄μ…˜μ˜ 차이λ₯Ό μ±—μ§€ν”Όν‹°ν•œν…Œ λ¬ΌμœΌλ‹ˆ λΉ„μŠ·ν•œλ° λ‹€λ₯΄λ‹€κ³  ν•΄μ„œ 검색을 ν•΄ λ΄€μŠ΅λ‹ˆλ‹€.

Bottom up 상ν–₯식 Top down ν•˜ν–₯식
for둜 κ΅¬ν˜„ μž¬κ·€ν•¨μˆ˜λ‘œ κ΅¬ν˜„
μž‘μ€ 문제λ₯Ό λͺ¨μ•„ 큰 문제 ν•΄κ²° 큰 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μž‘μ€ μž¬κ·€ ν•¨μˆ˜ 호좜
점화식 ν•„μš” 점화식 ν•„μš”
λ©”λͺ¨μ΄μ œμ΄μ…˜ μ—†μŒ λ©”λͺ¨μ΄μ œμ΄μ…˜ = 캐싱결과 μ €μž₯용 λ¦¬μŠ€νŠΈλ‚˜ 사전을 DP ν…Œμ΄λΈ”μ΄λΌ 함.
μ˜€λ²„ν—€λ“œλ₯Ό 쀄일 수 μžˆλ‹€. 일반적으둜 μ„±λŠ₯이 더 μ’‹λ‹€. **μ˜€λ²„ν—€λ“œ κ°€λŠ₯성이 μžˆλ‹€.
(μ•„λ§ˆλ„ 1,4,5,7,10처럼 ν•΄κ²°ν•  λ•Œλ₯Ό λ§ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.)**

<ν‘œ 원문 좜처: https://chae52.tistory.com/206> 일뢀 μˆ˜μ •

ν‘œλ₯Ό λ³΄λ‹€λ³΄λ‹ˆ 그럼 dp ν…Œμ΄λΈ”κ³Ό λ©”λͺ¨μ΄μ œμ΄μ…˜μ€ 같은건가? ν•˜λŠ” 생각이 λ“€μ–΄ μ—κ²Œ λ¬Όμ–΄λ³΄λ‹ˆ 또 λ‹€λ₯΄λ‹΅λ‹ˆλ‹€. λ―Έμ‹¬μ©μ–΄μ„œ μ°Ύμ•„λ³΄λ‹ˆ μŠ€νƒ μ˜€λ²„ν”Œλ‘œμ— κ΄€λ ¨ μ£Όμ œκ°€ (λ‹Ήμ—°νžˆ) μžˆμŠ΅λ‹ˆλ‹€.

λ©”λͺ¨μ΄μ œμ΄μ…˜κ³Ό 동적 ν”„λ‘œκ·Έλž˜λ°μ˜ 차이점은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?