일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- nullpointerexception방지
- Kotlin
- Hilt
- list
- composelifecycle
- 배열
- 파이썬문법
- Python
- 백준
- disposableeffect
- Dependency
- Java
- programmers
- jetpack
- 자바
- ContentProvider
- compose
- 파이썬
- 리스트
- 자바set
- 백준파이썬
- filternotnull()
- Provider
- 자바리스트정렬
- 오블완
- 프로그래머스
- 문자열
- 티스토리챌린지
- android
- 자료형
Archives
- Today
- Total
study gomi
Algorithm, Python, C++ 피보나치 수열 (동적 계획법) 본문
728x90
반응형
동적 계획법 / 개념&활용 / 예시(피보나치 수열)
그나저나 c++ 세상 오랜만... 다 잊어버렸다 미쳐 진짜
동적 계획법(Dynamic Programming, DP)
- 큰 문제를 해결하기 위해 작은 부분 문제를 해결하고 그 결과를 저장, 재활용하여 전체 문제를 해결.
- 최적화 문제, 최단 경로 문제
- 핵심은 메모이제이션(Memoization) : 작은 부분 문제들의 해결 값을 저장 -> 재사용하는 구조
- 특징 : 중복되는 부분 문제들의 해결을 효율적으로 처리하여 전체적인 계산량을 감소시킴
더보기
1. 최적 부분 구조(Optimal Substructure)
큰 문제의 최적해가 작은 문제들의 최적해로 구성되어 있어야 한다.
2. 중복 부분 문제(Overlapping Subproblems)
동일한 부분 문제가 여러 번 반복되어 해결되어야 한다.
- 구현 : 탑다운(Top-Down)과 바텀업(Bottom-Up) 두 가지 방식
더보기
Top-down : 재귀적인 방법으로 작은 문제들을 해결, 그 결과를 메모제이션하여 활용
Bottom-Up : 작은 문제부터 시작하여 전체 문제를 해결하는 방법으로, 일반적으로 반복문 사용.
- 피보나치 수열
Python↓
더보기
def fibonacci_recursive(n):
if n <= 1:
return n
else:
return fibonacci_recursive(n-1) + fibonacci_recursive(n-2)
def fibonacci_memoization(n, memo={}):
if n <= 1:
return n
elif n not in memo:
memo[n] = fibonacci_memoization(n-1, memo) + fibonacci_memoization(n-2, memo)
return memo[n]
# 피보나치 수열의 10번째 항까지 출력
for i in range(10):
print(fibonacci_recursive(i), end=' ')
print()
for i in range(10):
print(fibonacci_memoization(i), end=' ')
C++↓
더보기
#include <iostream>
#include <unordered_map>
using namespace std;
unordered_map<int, int> memo;
int fibonacci_recursive(int n) {
if (n <= 1) {
return n;
} else {
return fibonacci_recursive(n-1) + fibonacci_recursive(n-2);
}
}
int fibonacci_memoization(int n) {
if (n <= 1) {
return n;
} else if (memo.find(n) == memo.end()) {
memo[n] = fibonacci_memoization(n-1) + fibonacci_memoization(n-2);
}
return memo[n];
}
int main() {
// 피보나치 수열의 10번째 항까지 출력
for (int i = 0; i < 10; ++i) {
cout << fibonacci_recursive(i) << ' ';
}
cout << endl;
for (int i = 0; i < 10; ++i) {
cout << fibonacci_memoization(i) << ' ';
}
cout << endl;
return 0;
}
728x90
반응형
'Practice > Algorithm' 카테고리의 다른 글
Algorithm, Python 이분 탐색(Binary Search) (1) | 2024.02.02 |
---|---|
Algorithm, Python 탐색 알고리즘 세 가지 (완전 탐색/DFS/BFS) (2) | 2024.01.30 |
Algorithm, Python n 이하의 모든 소수를 찾는 코드 (에라토스테네스의 체 알고리즘) (3) | 2024.01.10 |