Quy hoạch động là gì? (Dynamic Programming)
Quy hoạch động (dynamic programming, viết tắt DP) không phải một thuật toán cụ thể, mà là một cách tư duy: khi một bài toán lớn chứa rất nhiều bài toán con lặp lại, ta tính mỗi bài con đúng một lần rồi cất kết quả lại để dùng. Bạn sẽ thấy Fibonacci từ đệ quy mũ trở thành tuyến tính chỉ nhờ một mẹo đơn giản: đừng tính lại thứ đã tính rồi.
1. Trực quan: đừng nhân hai lần cùng một phép tính
Hãy tưởng tượng bạn được giao tính 2 + 2 + 2 + 2. Một người bạn ngồi cạnh hỏi: "Tổng của ba số 2
đầu là bao nhiêu?" Bạn nhẩm ra 6. Rồi bạn ấy lại hỏi y hệt câu đó lần nữa. Bạn có nhẩm lại từ đầu
không? Tất nhiên là không — bạn nhớ kết quả 6 và trả lời ngay.
DP chính là cái phản xạ "tôi đã tính rồi, để tôi nhớ lại" đó, nhưng áp dụng cho máy tính. Vấn đề là máy tính không tự nhớ: nếu ta viết đệ quy ngây thơ, nó sẽ tính đi tính lại cùng một bài con đến hàng triệu lần.
Cây đệ quy Fibonacci fib(5) — chú ý fib(2) bị tính TỚI 3 LẦN:
fib(5)
/ \
fib(4) fib(3)
/ \ / \
fib(3) fib(2) fib(2) fib(1)
/ \ ... ...
fib(2) fib(1)
...
=> Cùng một nhánh fib(2), fib(3) bị làm lại nhiều lần => LÃNG PHÍ.