Applied Algorithms - Chapter 5.1 (HUST) Thầy Phạm Quang Dũng

LI
lienhejb
0 téléchargements
6
0

Contenu du document

Page 1

goupee.vn goupee.com THUẬT TOÁN ỨNG DỤNG CẤU TRÚC DEQUE Phạm Quang Dũng Bộ môn KHMT dungpq@soict.hust.edu.vn 1 fb.com/goupee.vn

Page 2

goupee.vn goupee.com DEQUE  Cấu trúc dữ liệu tuyến tính có tính chất của cả ngăn xếp và hàng đợi:  Thêm 1 phần tử vào cuối deque  Lấy 1 phần tử ở đầu deque ra  Lấy 1 phần tử ở cuối deque ra  Trong C++  Khai báo: deque<int>  Phương thức: push_back(), push_front(), pop_front(), pop_back(), back(), front(), empty() 2 fb.com/goupee.vn

Page 3

goupee.vn goupee.com Quy hoạch động sử dụng deque  Cho dãy a1, a2, …, an và 2 số nguyên dương L1 < L2. Hãy tìm dãy con 1 ≤ j1 < j2 < … < jk ≤ n sao cho L1 ≤ jq+1 – jq ≤ i2 và , , …, có tổng cực đại 3 fb.com/goupee.vn

Page 4

goupee.vn goupee.com Quy hoạch động sử dụng deque  Định nghĩa bài toán con  S(i): tổng cực đại của dãy con của dãy a1, …, ai thỏa mãn đề bài mà phần tử cuối cùng là ai  Công thức quy hoạch động  S(i) = max(ai + S(j) | L1 ≤ i – j ≤ L2} 4 fb.com/goupee.vn

Page 5

goupee.vn goupee.com Quy hoạch động sử dụng deque  Định nghĩa bài toán con  S(i): tổng cực đại của dãy con của dãy a1, …, ai thỏa mãn đề bài mà phần tử cuối cùng là ai  Công thức quy hoạch động  S(i) = max(ai + S(j) | L1 ≤ i – j ≤ L2}  Khởi tạo deque, lưu trữ các chỉ số j sao cho S(j) không tăng và là ứng cử viên để tính toán các bài toán con S(i)  Mỗi khi xét đến chỉ số i (i = 1,…, n) thì  Đưa hết các chỉ số j ở đầu deque tại đó j < i – L2 ra ngoài (vì nó ko là ứng cử viên để xác định S(i), S(i+1),…)  Đưa hết các chỉ số j ở cuối deque tại đó S(j) < S(i-L1) (do những chỉ số j như vậy không có ý nghĩa nữa trong việc xác định S(i), S(i+1),… 5 fb.com/goupee.vn

Page 6

goupee.vn goupee.com Quy hoạch động sử dụng deque #include <bits/stdc++.h> for(int i = 1; i <= n; i++){ using namespace std; while(!q.empty() && (q.front() < const int N = 1e6+1; i - L2)) int a[N], S[N]; q.pop_front(); int n,L1,L2,ans; if(i - L1 >= 1){ int main(){ while(!q.empty() && S[q.back()] < ios_base::sync_with_stdio(0); S[i- L1]) cin.tie(0); q.pop_back(); cin >> n >> L1 >> L2; q.push_back(i-L1); for(int i = 1; i <= n; i++) } cin >> a[i]; S[i] = a[i] + (q.empty() ? 0 : deque<int> q; S[q.front()]); ans = 0; ans = max(ans,S[i]); } cout << ans; } 6 fb.com/goupee.vn

Affichage des 6 premières pages. Téléchargez le document pour le voir en entier.

Commentaires (0)

Se connecter pour rejoindre la discussion

Aucun commentaire pour le moment. Soyez le premier !