第 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
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
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
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
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
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
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
显示前 6 页。下载资料查看完整内容。
暂无评论。快来抢沙发吧!
评论 (0)
暂无评论。快来抢沙发吧!