Cộng/nhân cả dãy

Một phần của tài liệu Một Số Cấu Trúc Dữ Liệu Đặc Biệt (Trang 44 - 46)

4. Một số bài toán ví dụ

4.1.4. Cộng/nhân cả dãy

Tương tự như bài toán truy vấn tổng, nhưng bổ sung thêm phép toán: ( ): Cộng tất cả các phần tử của dãy lên

( ): Nhân tất cả các phân tử của dãy với

4.2. Một số bài toán luyện tập

4.2.1. Uống rượu

(Nguồn bài: thầy Nguyễn Đức Nghĩa, 2002)

Bờm thắng phú ông trong một cuộc đánh cược và buộc phú ông phải đãi rượụ Phú ông bèn bày ra một dãy chai chứa đầy rượu, và nói với Bờm rằng có thể

uống bao nhiêu tuỳ ý, nhưng đã chọn chai nào thì phải uống hết và không được uống ở chai liền nhau bởi đó là điều xui xẻọ

Bạn hãy chỉ cho Bờm cách uống được nhiều rượu nhất.

Dữ liệu: Vào từ file văn bản BOTTLES.INP

 Dòng 1 chứa hai số nguyên 2

 Dòng 2 chứa các số nguyên dương ( ) là dung tích của các chai rượu phú ông bày ra, theo thứ tự liệt kê từ chai thứ nhất tới chai thứ

Kết quả: Ghi ra file văn bản BOTTLES.OUT

 Dòng 1 ghi số chai được chọn và lượng rượu tối đa có thể uống.

 Dòng 2 ghi chỉ số của các chai được chọn theo thứ tự tăng dần.

Các số trên một dòng của Input/Output files được/phải ghi cách nhau ít nhất một dấu cách Ví dụ BOTTLES.INP BOTTLES.OUT 6 3 6 10 10 13 10 10 4 40 2 3 5 6

Gợi ý lời giải:

Thuật toán quy hoạch động ( ) tính [ ] là lượng rượu lớn nhất có thể uống từ chai thứ 1 tới chai thứ không phải là khó, tuy nhiên khi khá lớn, ta cần có sự hỗ trợ của cấu trúc dữ liệu để làm giảm thời gian thực hiện giải thuật.

Đặt lại vấn đề: Thay vì chọn rượu để uống, ta cần chọn một số chai rượu để bỏ sao cho tổng lượng rượu phải bỏ là nhỏ nhất.

Goi [ ] là lượng rượu ít nhất phải bỏ trong trường hợp được chọn trong các chai từ 1 tới , không chọn chai liền nhau, và chắc chắn có bỏ chai thứ . Ta quan tâm tới [ ]: lượng rượu ít nhất phải bỏ khi chọn trong chaị

Công thức truy hồi tính [ ]

[ ] { [ ]

{ [ ]} [ ] (5) Lý do vì khi đã bỏ chai , chai liền trước đó phải bỏ phải là chai nằm trong phạm vi từ tới .

Phép tính { [ ]} [ ] có thể tính được nhanh nhờ cây quản lý phạm vi 1 chiều, do đó là truy vấn giá trị nhỏ nhất trong mảng từ vị trí tới vị trí .

Thời gian thực hiện giải thuật ( ). Chương trình: BOTTLES.PAS

Cách khác: Có thể sử dụng Heap để tính min.

Một phần của tài liệu Một Số Cấu Trúc Dữ Liệu Đặc Biệt (Trang 44 - 46)

Tải bản đầy đủ (PDF)

(89 trang)