Quy hoạch động (Dynamic Programming)
DP là gì?
Dynamic Programming là kỹ thuật giải bài toán bằng cách:
- Chia thành bài toán con chồng chéo
- Lưu kết quả để tránh tính lại
- Xây dựng nghiệm từ các bài toán con
Top-Down (Memoization)
Python
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
if n <= 1:
return n
return fib(n - 1) + fib(n - 2)Bottom-Up (Tabulation)
Python
def fib_tab(n):
if n <= 1:
return n
dp = [0] * (n + 1)
dp[1] = 1
for i in range(2, n + 1):
dp[i] = dp[i - 1] + dp[i - 2]
return dp[n]Coin Change
Python
def coin_change(coins, amount):
dp = [float('inf')] * (amount + 1)
dp[0] = 0
for i in range(1, amount + 1):
for coin in coins:
if coin <= i:
dp[i] = min(dp[i], dp[i - coin] + 1)
return dp[amount] if dp[amount] != float('inf') else -1💡
Framework DP: Xác định state → Base case → Transition → Answer
Tiếp theo: Thuật toán tham lam
Last updated on