You are on page 1of 23

PHONG VŨ 20:30, TỐI NAY

QUY HOẠCH ĐỘNG


CƠ BẢN VÀ
MẢNG CỘNG DỒN

CODE MELY
01 07 12

MỤC LỤC

Giới thiệu về Quy hoạch động Một vài bài QHĐ cơ bản Giới thiệu về mảng cộng dồn
QUAY LẠI TRANG CHƯƠNG TRÌNH

QUY HOẠCH ĐỘNG LÀ GÌ?


Quy hoạch động (Dynamic Programming) là một kỹ thuật chia bài toán
lớn thành các bài toán con và sử dụng lời giải của những bài toán con đó
để giải bài toán ban đầu
MỘT SỐ BÀI TOÁN QUY HOẠCH ĐỘNG
ĐIỂN HÌNH

DÃY FIBONACCI DÃY CON TĂNG DÀI NHẤT (LONGEST


INCRESING SUBSEQUENCE)

BÀI TOÁN CÁI TÚI (KNAPSACK) BÀI TOÁN CHIA KẸO


Tìm hiểu về dãy Fibonacci
Dãy Fibonacci là dãy 1, 1, 2, 3, 5, 8, 13, . . . hay có thể viết tổng quát dưới dạng:

Cài đặt bằng đệ quy

Đây là cách tiếp cận Top - Down, các bạn có thể thấy rằng với cách cài đặt
này, một bài toán con có thể sẽ bị tính lại nhiều lần
-> Chậm, tốn bộ nhớ
Tìm hiểu về dãy Fibonacci
Cải tiến
Lưu kết quả của hàm calFib() vào mảng và tái sử dụng thay vì tính lại nhiều lần

Cài đặt không dùng đệ quy


Tìm hiểu về dãy Fibonacci
Nhận xét
Với cách cài đặt thứ hai, ta thấy code ngắn gọn, dễ hiểu và dễ cài đặt hơn so với cách
cài đặt đệ quy.

Tiếp tục tìm hiểu sâu hơn với mình nhé !


Dynamic Programming
(Quy hoạch động)
Atcoder Educational DP Contest - Problem A
Cách giải vét cạn

Nhận xét
Cách giải bằng quy hoạch động
Dùng kết quả cũ để tính trạng thái hiện tại (Pull DP)

Dùng kết quả hiện tại để tính các trạng thái tiếp theo (Push DP)
Cách giải bằng quy hoạch động
Cần in ra kết quả là gì?
Vì đề bài yêu cầu tính chi phí ít nhất để đi đến hòn đá N nên đáp án cuối cùng chính là dp[N]

Lưu ý:
Các bạn cần handle một số trường hợp bị tràn mảng, tràn số
Tuỳ mỗi bài toán thì giá trị khởi tạo của dp[0] hay dp[1]... sẽ có các giá trị khác nhau
Tương tự, đáp án cũng có thể không phải là dp[N]
Atcoder Educational DP Contest - Problem D - Knapsack 1

Cách giải “trâu”


Duyệt quay lui từng cách chọn đồ vật để cho vào túi
Mỗi đồ vật sẽ có 2 phương án là lấy hoặc không lấy
-> Độ phức tạp O(2^N)
-> Không thể AC
Giải bằng quy hoạch động
Giải bằng quy hoạch động
Tối ưu
Đếm số đường đi trong ma trận
Cách giải giới hạn siêu dễ

Đáp án của bài toán chính là dp[N][M]


Chúng ta đã đi qua hết các vấn đề
liên quan đến quy hoạch động của
buổi hôm nay. Cùng mình tìm hiểu về
mảng cộng dồn nhé !
Mảng cộng dồn
Định nghĩa và cách cài đặt
Với mảng A có n phần tử, mảng cộng dồn được định
nghĩa như sau:
Mảng cộng dồn trên ma trận
Mảng cộng dồn hai chiều được định nghĩa gần giống mảng một chiều:

Tính tổng của hình chữ nhật từ (x; y) đến (u; v)


Ưu điểm và nhược điểm của mảng cộng dồn

Ưu điểm Nhược điểm

Tốc độ truy xuất nhanh O(1) Không thể sử dụng khi bài toán yêu
Có nhiều ứng dụng cầu thay đổi giá trị của các phần tử
Dễ cài đặt trong mảng
Team Mely chúng mình hiện đang
mở Educational Contest 2 với các
chủ đề liên quan đến Tham lam,
STL, Quy hoạch động. Ngoài ra
chúng mình cũng đang mở đơn
tuyển CTV Gen 5. Rất mong các
bạn có thể tham gia thử sức.
Bạn có câu hỏi
nào không?
Nếu có, hãy liên hệ trực tiếp với chúng
mình qua fanpage Code Mely nhé !
Thank
! you !
Mely yêu tất cả các bạn !

You might also like