Trong bài blog này, mình cảm ơn bạn Nguyễn Khánh Phúc và Đỗ Anh Khoa đã đóng góp và review bài blog này.

<aside> 💡

Cân nhắc nhẹ:

Khái niệm cơ bản

Quy hoạch động (tên tiếng Anh là “Dynamic Programming”, từ nay về sau tác giả sẽ viết tắt thành cụm từ “DP”) là một kĩ thuật lập trình được sử dụng phổ biến để tối ưu hóa lời giải đệ quy khi các bài toán con giống nhau được gọi lại.

Khi nào ta sử dụng Quy hoạch động (DP) ?

DP được sử dụng để giải các bài toán có các đặc điểm sau:

1. Optimal Substructure (Cấu trúc phụ/con tối ưu):

Về cơ bản tính chất này có nghĩa là chúng ta sẽ sử dụng kết quả tối ưu của các bài toán con đã xử lí trước đó để thu được kết quả tối ưu cho bài toán lớn hơn.

Ví dụ

Ta xem xét bài toán tìm đường đi có chi phí nhỏ nhất trên một đồ thị có trọng số từ 1 đỉnh nguồn (bắt đầu) đến 1 đỉnh đích (kết thúc).

Bình thường, khi ta thấy bài toán này, trong đầu chỉ nghĩ chăm chăm về một hướng giải là làm sao đó để tìm được đường đi giữa đinh bắt đầu và đỉnh kết thúc, nhưng ta có thể chia nhỏ bài toán ra làm 2 bài toán nhỏ hơn theo hướng như sau: