Tải bản đầy đủ (.pdf) (6 trang)

Slide thuật toán ứng dụng chương 5 cấu trúc deque

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (150.93 KB, 6 trang )

.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

/>



×