κ°λ
λμ κ³νλ²μ μ μλ μλμ κ°λ€.
μ²μ μ£Όμ΄μ§ λ¬Έμ λ₯Ό λ μμ λ¬Έμ λ€λ‘ λλ λ€ κ° μ‘°κ°μ λ΅μ κ³μ°νκ³ , μ΄ λ΅λ€λ‘λΆν° μλ λ¬Έμ μ λν λ΅μ κ³μ°νλ λ°©μ.
μ μλ§ κ°μ§κ³ λ μ΄ν΄νκΈ° μ½μ§ μλ€. λ€μμ μ€λͺ νκ² μ§λ§, κ²°λ‘ μ μΌλ‘ λ§νμλ©΄ λ°°μ΄μ λ§λ€μ΄ κ°λ€μ μ μ₯νκ³ , νμ κ·Έκ²λ€μ κ°μ§κ³ λ΅μ ꡬνλ λ°©λ²μ΄λ€.
λμ κ³νλ²μ μ΄μ©ν΄ λ¬Έμ λ₯Ό νλ €κ³ νλ€λ©΄ λ¨Όμ μ νμμ μΈμμΌ νλ€. μ νμμ΄λΌλ κ²μ μ΄λ€ μμ΄μ μΌλ°νμ μ΄μ μ νλ€μ μ΄μ©ν΄ μ μν μμ΄λ€. κ³ λ±νκ΅ λ λ°°μ λ μμ΄μ μΌλ°νμ ꡬνλ―μ΄ nλ²μ§Έ νμ ꡬνλ λ°©λ²μ μμΌλ‘ λνλΈλ€κ³ μκ°νλ©΄ μ½λ€. μλ₯Ό λ€μ΄ ννλ€ μλ νΌλ³΄λμΉ μμ΄μ μ νμμ μλμ κ°λ€.
μ΄μ μ΄ μμ κ°μ§κ³ μ½λλ‘ μμ±μ ν΄ λ³΄λλ‘ νμ. μΌλ°μ μΌλ‘ μ¬κ·ν¨μλ₯Ό μ΄μ©ν΄ μμ±μ νλλ° κ·Έλ κ² νλ©΄ μλμ κ°μ μ½λκ° λμ¬ κ²μ΄λ€.
#include <iostream>
using namespace std;
//νΌλ³΄λμΉ μμ΄μ κ³μ°νλ ν¨μ by μ¬κ·
int fibo(int x) {
if (x <= 1) return x;
return fibo(x - 1) + fibo(x - 2);
}
int main() {
int T;
cin >> T;
cout << fibo(T);
}
κ·Έλ°λ° μ΄λ κ² μ€νμ νλ€λ©΄ μ»΄ν¨ν°κ° κ°μ μΌμ κ΅μ₯ν λ§μ΄ λ°λ³΅νκ² λλ€. λ§μΌ νΌλ³΄λμΉ μμ΄μ 6λ²μ§Έ νμ ꡬνλ€κ³ κ°μ νμ. κ·Έλ λ€λ©΄ μ»΄ν¨ν°λ μλ μμ λ€μ μννκ² λλ€.
κ·Έλ¦Όμ 보면 fibo(2)λ₯Ό ꡬνλ κ³Όμ μ΄ 3λ² λ°λ³΅λλ€. μ΄κ² λ§κ³ λ κ·Έλ¦Όμ μμΈν 보면 κ°μ μμ μ μ»΄ν¨ν°κ° κ³μ λ°λ³΅νκ² λλ€λ κ²μ μ μ μλ€. fibo(3)μ ꡬνλ κ³Όμ λ 2λ²μ΄λ λ°λ³΅λλ€. μκ° μ»€μ§λ©΄ 컀μ§μλ‘ μ΄λ¬ν μ€λ³΅λλ κ³Όμ μ κΈ°νκΈμμ μΌλ‘ μ¦κ°νκ² λ κ²μ΄λ€. μ΄λ μ¬μ©νλκ²μ΄ λ©λͺ¨μ΄μ μ΄μ (memoization) κΈ°λ²μ΄λ€. λ©λͺ¨μ΄μ μ΄μ μ μ μλ μλμ κ°λ€.
μ»΄ν¨ν° νλ‘κ·Έλ¨μ΄ λμΌν κ³μ°μ λ°λ³΅ν΄μΌ ν λ, μ΄μ μ κ³μ°ν κ°μ λ©λͺ¨λ¦¬μ μ μ₯ν¨μΌλ‘μ¨ λμΌν κ³μ°μ λ°λ³΅ μνμ μ κ±°νμ¬ νλ‘κ·Έλ¨ μ€ν μλλ₯Ό λΉ λ₯΄κ² νλ κΈ°μ μ΄λ€.
μμ "λ°°μ΄μ λ§λ€μ΄ κ°λ€μ μ μ₯νλ€." λΌκ³ νλλ° μ΄κ²μ΄ λ©λͺ¨μ΄μ μ΄μ κΈ°λ²μ μμμ΄λ€. fibo(2) = fibo(1)+fibo(0)=2 λΌλ κ²μ νλ² κ΅¬νλ€λ©΄ μ΄κ²μ λ°°μ΄μ 2λ²μ§Έ μΈλ±μ€μ μ μ₯νκ³ (첫λ²μ§Έμ μ μ₯ν΄λ λμ§λ§ μ§κ΄μ μΌλ‘ μ¬μ©νκΈ° μν΄ 0λ² μΈλ±μ€λ μ£Όλ‘ λΉμλλ€.) λμ€μ λ fibo(2)μ κ°μ΄ νμν΄μ§λ©΄ λλ²μ§Έ μΈλ±μ€μ μλ κ°μ κΊΌλ΄μμ μ¬μ©νλ κ²μ΄λ€. κ·Έλ¬λ μμ μμ±ν μ¬κ·μ©λ²μ λ°©κΈ λ°°μ΄ λμ κ³νλ²μ μ μ©νλ €λ©΄ λκ°μ§λ₯Ό μΆκ°νλ©΄ λλ€.
- λ§μ½ λ°°μ΄μ ν΄λΉ μΈλ±μ€κ° 0μ΄ μλλΌλ©΄(λΉμ΄μμ§ μλ€λ©΄) κ·Έ κ°μ 리ν΄νλ€
- κ°μ λ°°μ΄μ μ μ₯ν λ€ κ·Έ κ°μ 리ν΄νλ€.
ν΅μ¬μ μ¬νκΉμ§λ κ°μ 리ν΄νκΈ°λ§ νμ§λ§ μ΄μ λ λ°°μ΄μ κ°μ μ μ₯νλ€λ κ²μ΄λ€. μλ μ½λλ₯Ό 보면 λ°°μ΄μ κ°μ μ μ₯νλ λΆλΆμ΄ μΆκ°λμ΄ μλ€.
#include <iostream>
using namespace std;
//νΌλ³΄λμΉ μμ΄μ κ°μ μ μ₯ν λ°°μ΄
int arr[10001];
//νΌλ³΄λμΉ μμ΄μ κ³μ°νλ ν¨μ by λμ κ³νλ²
int fibo(int x) {
//μ΄κΈ° 쑰건, fibo(0)=0 fibo(1)=1
if (x <= 1) {
arr[x] = x;
return arr[x];
}
//λ§μ½ μ΄λ―Έ κ°μ ꡬν κ²½μ°λΌλ©΄ μμ ꡬν κ°μ μ¬μ©νλ€.
if (arr[x] != 0) {
return arr[x];
}
arr[x] = fibo(x - 1) + fibo(x - 2);
return arr[x];
}
int main() {
int T;
cin >> T;
cout << fibo(T);
}
μ μ½λλ₯Ό 보면 μ μ μλ―μ΄ μ΄λ―Έ κ°μ ꡬνλ€λ©΄ μ¬κ·ν¨μλ₯Ό λ€μ νΈμΆνλκ²μ΄ μλλΌ κ΅¬ν κ°μ μ¬μ©νλ€λ κ²μ΄λ€. μ¦ κ°μ κ°μ λ€μ κ³μ°ν νμκ° μλ€.
μκ°λ³΅μ‘λ
μκ°λ³΅μ‘λλ μ΄λ ΅μ§ μκ² κ΅¬ν μ μλ€.
λ°°μ΄μ ν¬κΈ°(νΉμ ν μ΄λΈμ ν¬κΈ°) X ν μΉΈμ μ±μΈλ 걸리λ μκ°
μ΅μ μ κ²½μ° λͺ¨λ λ°°μ΄μ μ±μμΌ νκΈ° λλ¬Έμ μμ΄ μμκ°μ΄ λμ¨λ€. λ§μΌ νΌλ³΄λμΉ μμ΄μ λμ κ³νλ²μΌλ‘ ꡬννμ κ²½μ°μ, μ΅μ μ κ²½μ° nλ²μ§Έ νκΉμ§ λ°°μ΄μ μ±μμΌ νκΈ° λλ¬Έμ λ°°μ΄μ ν¬κΈ°λ n, νμΉΈμ μ±μ°λ λ°μ 걸리λ μκ°μ μΌμ ν μκ°. μ¦ 1μ΄κΈ° λλ¬Έμ μ μ½λμ μκ°λ³΅μ‘λλ O(n)μ΄λ€.
Top-down vs Bottom-up
λμ κ³νλ²μ ꡬννλ λ°©λ²μλ ν¬κ² λκ°μ§κ° μλλ° μμμ ꡬνν λλ‘ μ¬κ·λ₯Ό μ΄μ©ν΄ ꡬνλ λ°©μμ΄ Top-downλ°©μμ΄λ€. μ λ°©λ²μμ int x, μ¦ ν¨μ μΈμ λΆλΆμ λ€μ΄μ€λ μκ° μ μ μμμ§λ€(5->4->3 ...) μ΄μ Bottom-upλ°©μμ λν΄ μμ보μ. λκ°μ§μ μ°¨μ΄μ μ μλμ κ°λ€.
Top-down | Bottom-up |
ν° λ¬Έμ λ₯Ό μͺΌκ°λκ°λ€. | μμ λ¬Έμ λΆν° μ¬λΌκ°λ€. |
μ¬κ·λ‘ ꡬννλ€. | λ°λ³΅λ¬ΈμΌλ‘ ꡬννλ€. |
κ·ΈλΌ λ°λ³΅λ¬Έμ μ΄μ©ν΄μ μμ λ§λ νΌλ³΄λμΉ ν¨μλ₯Ό λ€μ λ§λ€μ΄ 보μ.
#include <iostream>
using namespace std;
int arr[10001];
int main() {
int T;
cin >> T;
//μ΄κΈ°κ° μΈν
arr[0] = 0;
arr[1] = 1;
for (int i = 2; i <= T; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
cout << arr[T];
}
μ μ½λλ₯Ό 보면 iμ κ°μ΄ 2λΆν° TκΉμ§ μ¦κ°νλ κ²μ λ³Ό μ μλ€. μμ κ°μ΄ μμ λ¬Έμ λΆν° ꡬνλ κ²μ Bottom-upλ°©μμ΄λΌκ³ νλ€.
κ°μ΄ νλ©΄ μ’μ λ¬Έμ
μλ λ¬Έμ λ€μ λ΄κ° dpλ₯Ό λ°°μ°κ³ νμλ λ¬Έμ λ€μ΄λ€.
μμμ λ€λ€λ νΌλ³΄λμΉ μμ΄μ μ‘°κΈ μμ©ν λ¬Έμ μ΄λ€.
https://www.acmicpc.net/problem/1003
dpλ₯Ό μ΄μ©ν΄μ ν μ μλ λ¬Έμ μ΄λ€. μ νμμ μ΄λ»κ² μΈμΈμ§ μκ°νλ©° νμ΄λ³΄μ.
https://www.acmicpc.net/problem/1463
<νμ΄>
https://sectumsempra.tistory.com/84
μ΄λ»κ² κ³λ¨μ μ¬λΌκ°μΌ μ΅κ³ μ μλ₯Ό μ»μ μ μλμ§ μκ°νλ©° λ¬Έμ λ₯Ό νλλ‘ νμ. μ°μλ 3κ°μ κ³λ¨μ λ°μ§ μκΈ° μν΄μλ μ΄λ»κ² ν΄μΌ ν μ§ μκ°ν΄λ³΄μ. μ΄λ ΅λ€λ©΄ μλ ννΈλ₯Ό λ³΄κ³ λ€μ λμ ν΄λ³΄μ. (ννΈλ μλ νλ¦° κΈμ¨λ‘ μ νμλ€.)
https://www.acmicpc.net/problem/2579
ννΈ : nλ²μ§Έ κ³λ¨κΉμ§ μ€λ₯΄λ κ²½μ°λ n-3κΉμ§ μ€λ₯΄κ³ 2μΉΈ 1μΉΈμ μ€λ₯΄κ±°λ, n-2κΉμ§ μ€λ₯΄κ³ 2μΉΈμ μ€λ₯΄λ κ²½μ°κ° μλ€. λ μ€ μ΄λ€ κ°μ΄ μ΅λκ°μΌκ°? (λ§μΌ n-1κΉμ§ μ€λ₯΄κ³ νμΉΈμ λ μ¬λΌκ°λ€κ³ ν κ²½μ°, μ°μν΄μ μΈ κ³λ¨μ λ°λ κ²½μ°κ° λ°μν μ μλ€.)
2xnνμΌλ§μ 1, 2κ° κ°κ° μλλ° λ§μΌ νΈλ λ°©λ²μ λͺ°λλ€λ©΄ 1μ νΈλ λ°©λ²μ μ΄ν΄νκ³ , 2λ₯Ό νΌμ νμ΄λ³΄λλ‘ νμ. μμ΄λμ΄λ§ λ μ¬λ¦°λ€λ©΄ ꡬννλκ²μ ν¬κ² μ΄λ ΅μ§ μλ€.
2xnνμΌλ§
https://www.acmicpc.net/problem/11726
2xnνμΌλ§ 2
https://www.acmicpc.net/problem/11727
μ΄ λ¬Έμ λ νΉμ΄νκ² bottom-upμ μ μ©νλ€.
https://www.acmicpc.net/problem/17626
μ΄ μΈμλ μλ λ§ν¬(λ°±μ€-λ€μ΄λλ―Ή νλ‘κ·Έλλ°)μ λ€μ΄κ°λ©΄ dpλ₯Ό μ΄μ©ν΄ νΈλ λ§μ λ¬Έμ λ€μ λ³Ό μ μλ€.
https://www.acmicpc.net/problemset?sort=ac_desc&algo=25
'μ½λ©ν μ€νΈ > μκ³ λ¦¬μ¦' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[C++ μκ³ λ¦¬μ¦] λ€μ΄λλ―Ήνλ‘κ·Έλλ°2 - λ°°λλ¬Έμ (Knapsack Problem) (0) | 2022.01.04 |
---|---|
[C++] λ²‘ν° νμ (0) | 2021.09.07 |
[C++] μ«μ μλ¦Ώμ λνκΈ° (0) | 2021.09.07 |
[C++ μκ³ λ¦¬μ¦] λΆν μ 볡(Divide and conquer) (0) | 2021.08.28 |
[C++ μκ³ λ¦¬μ¦] 그리λ(νμλ²,Greedy Algorithm) (2) | 2021.08.08 |
λκΈ