Thư Viện Câu Hỏi Phỏng Vấn
Tổng hợp các câu hỏi tuyển dụng thực tế theo nhiều cấp độ từ Entry đến Expert để bạn tự tin chinh phục nhà tuyển dụng.
Hãy phân biệt sự khác nhau giữa tiếp cận Bottom-Up (Tabulation) và Top-Down (Memoization) trong Quy hoạch động?
Bài toán cái túi (0/1 Knapsack Problem) được giải quyết bằng Quy hoạch động như thế nào?
Bài toán yêu cầu chọn các đồ vật có khối lượng và giá trị sao cho tổng khối lượng không vượt quá W và tổng giá trị lớn nhất:
- Trạng thái: Gọi
dp[i][w]là giá trị lớn nhất có thể đạt được khi chọn trongiđồ vật đầu tiên với giới hạn khối lượng làw. - Công thức truy hồi: Với đồ vật thứ
icó khối lượngweight[i]và giá trịval[i]:- Nếu
weight[i] > w: Không thể chọn đồ vật này ->dp[i][w] = dp[i-1][w]. - Nếu
weight[i] <= w: Ta chọn giá trị lớn hơn giữa việc lấy hoặc không lấy đồ vật ->dp[i][w] = max(dp[i-1][w], dp[i-1][w - weight[i]] + val[i]).
- Nếu
- Kết quả: Nằm ở ô
dp[n][W]với độ phức tạp thời gian là O(n*W).
Làm thế nào để triển khai và tối ưu hóa thuật toán hoặc cấu trúc dữ liệu liên quan đến LCS & LIS trong chủ đề Dynamic Programming?
Trong lập trình giải thuật với Dynamic Programming, việc làm chủ LCS & LIS yêu cầu lập trình viên hiểu rõ cấu trúc vật lý trong bộ nhớ và độ phức tạp tính toán:
- Độ phức tạp: Luôn đánh giá Time Complexity (thời gian) và Space Complexity (không gian) tối ưu nhất (ví dụ: tối ưu từ O(n^2) xuống O(n log n)).
- Trường hợp biên (Edge Cases): Xử lý kỹ các giá trị null, mảng rỗng, giá trị giới hạn cực đại/cực tiểu của kiểu dữ liệu.
- Mã nguồn mẫu: Triển khai giải pháp rõ ràng, súc tích bằng các cấu trúc dữ liệu cơ bản, tránh lạm dụng bộ nhớ phụ khi không cần thiết.



.png)
.png)