Lesson 30 — Tối ưu Quy hoạch động (DP Optimization)

Ba module tương tác cho các kỹ thuật tăng tốc / giảm bộ nhớ DP: Space optimization (bảng 2D → rolling 1 hàng), Monotonic deque (cửa sổ trượt min/max cho transition), và Matrix exponentiation (fib bằng lũy thừa ma trận 2×2, O(log n)).

1. Space optimization — bảng 2D → rolling 1 hàng O(nW) bộ nhớ → O(W)

Knapsack 0/1: bảng đầy đủ dp[i][w] nhưng hàng i chỉ đọc hàng i-1. Bấm Bước tiếp để xem từng hàng được tính rồi hàng cũ "trôi đi", chỉ giữ lại 1 hàng đang dùng.

hàng đang dùng (giữ) hàng cũ (vứt — rolling) ô đang tính
Bấm "Bước tiếp" để bắt đầu.
Bộ nhớ bảng đầy đủ (n+1)×(W+1):
Bộ nhớ rolling 1×(W+1):
Duyệt w GIẢM dần để dp[w-wt[i]] còn là giá trị hàng cũ (chưa lấy vật i). Đây là mấu chốt của knapsack 0/1 nén 1 chiều.

2. Monotonic deque — max trong cửa sổ trượt cho DP O(nk) → O(n)

Jump Game VI: dp[i] = a[i] + max(dp[i-k..i-1]). Deque giảm dần giữ các ứng viên còn cửa thắng; front = max trong cửa sổ. Bấm Bước tiếp để xem pop front (rời cửa sổ) + pop back (vô dụng) + push i.

i đang tính cửa sổ [i-k, i-1] front (= max)
Bấm "Bước tiếp" để bắt đầu.
Deque (chỉ số): []
Mỗi chỉ số vào/ra deque đúng 1 lần → tổng O(n) (amortized), không phải O(n·k).

3. Matrix exponentiation — fib bằng lũy thừa ma trận 2×2 O(n) → O(log n)

T = [[1,1],[1,0]], fib(n) = (T^n)[0][1]. Tính T^n bằng fast power: bình phương liên tiếp + nhân theo bit của n. Bấm Tính để xem từng vòng lặp và đếm số bước.

Nhập n rồi bấm "Tính".
Vòngbit của nresult (T^?)base ← base²
Số bước tuyến tính O(n):
Số bước matrix expo O(log n):
Kiểm chứng: T¹→f(1)=1, T²→f(2)=1, T³→f(3)=2, T⁵→f(5)=5. Mỗi nhân ma trận 2×2 là O(1).