.c
om
th
an
co
ng
THUẬT TỐN ỨNG DỤNG
cu
u
du
o
ng
CẤU TRÚC DEQUE
Phạm Quang Dũng
Bộ mơn KHMT
1
CuuDuongThanCong.com
/>
.c
om
DEQUE
Cấu trúc dữ liệu tuyến tính có tính chất của cả ngăn
ng
xếp và hàng đợi:
co
Thêm 1 phần tử vào cuối deque
an
Lấy 1 phần tử ở đầu deque ra
th
Lấy 1 phần tử ở cuối deque ra
ng
Trong C++
du
o
Khai báo: deque<int>
u
Phương thức: push_back(), push_front(), pop_front(),
cu
pop_back(), back(), front(), empty()
2
CuuDuongThanCong.com
/>
.c
om
Quy hoạch động sử dụng deque
Cho dãy a1, a2, …, an và 2 số nguyên dương L1 < L2.
cu
u
du
o
ng
th
an
co
ng
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
CuuDuongThanCong.com
/>
.c
om
Quy hoạch động sử dụng deque
Định nghĩa bài toán con
ng
S(i): tổng cực đại của dãy con của dãy a1, …, ai thỏa mãn
co
đề bài mà phần tử cuối cùng là ai
an
Công thức quy hoạch động
cu
u
du
o
ng
th
S(i) = max(ai + S(j) | L1 ≤ i – j ≤ L2}
4
CuuDuongThanCong.com
/>
.c
om
Quy hoạch động sử dụng deque
Định nghĩa bài toán con
Công thức quy hoạch động
co
bài mà phần tử cuối cùng là ai
ng
S(i): tổng cực đại của dãy con của dãy a1, …, ai thỏa mãn đề
an
S(i) = max(ai + S(j) | L1 ≤ i – j ≤ L2}
th
Khởi tạo deque, lưu trữ các chỉ số j sao cho S(j) không tăng
du
o
ng
và là ứng cử viên để tính tốn các bài tố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 ngồi (vì
cu
u
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
CuuDuongThanCong.com
/>
.c
om
Quy hoạch động sử dụng deque
for(int i = 1; i <= n; i++){
#include <bits/stdc++.h>
while(!q.empty() && (q.front() <
using namespace std;
q.pop_front();
int a[N], S[N];
if(i - L1 >= 1){
co
int n,L1,L2,ans;
an
int main(){
cin.tie(0);
q.pop_back();
q.push_back(i-L1);
ng
cin >> n >> L1 >> L2;
}
S[i] = a[i] + (q.empty() ? 0 :
S[q.front()]);
u
cu
ans = 0;
du
o
for(int i = 1; i <= n; i++)
cin >> a[i];
while(!q.empty() && S[q.back()] <
S[i- L1])
th
ios_base::sync_with_stdio(0);
deque<int> q;
i - L2))
ng
const int N = 1e6+1;
ans = max(ans,S[i]);
}
cout << ans;
}
6
CuuDuongThanCong.com
/>