btvn.vn
Tìm kiếm Đăng nhập

Chọn đoạn liên tiếp có tổng lớn nhất

Lưu trên thiết bị này
Kĩ thuật lập trình — CS · Chọn bài khác

Đoạn liên tiếp khác tập điểm rời rạc

Bài vận dụng của SGK mô hình hóa một hành trình bằng các địa điểm liên tiếp từ chỉ số `i` đến `j`, với `i ≤ j`. Điểm của hành trình là tổng `a[i]+…+a[j]`. Không được bỏ qua một địa điểm âm ở giữa nếu vẫn muốn đi tới địa điểm sau. Có thể chia chương trình thành mô-đun đọc dãy điểm, mô-đun tìm cặp chỉ số có tổng lớn nhất, và mô-đun báo kết quả. Với dãy giả `[2, -5, 4, 3, -1, 2, -6]`, đoạn chỉ số 2 đến 5 có tổng `4+3−1+2=8`, lớn hơn đoạn chỉ lấy `4+3=7`.

Cộng dần mỗi khi kéo dài đoạn

```python def doan_tong_lon_nhat(a): if not a: raise ValueError("Cần ít nhất một địa điểm") dau_tot = cuoi_tot = 0 tong_tot = a[0] for dau in range(len(a)): tong = 0 for cuoi in range(dau, len(a)): tong += a[cuoi] if tong > tong_tot: dau_tot, cuoi_tot, tong_tot = dau, cuoi, tong return dau_tot, cuoi_tot, tong_tot print(doan_tong_lon_nhat([2, -5, 4, 3, -1, 2, -6])) print(doan_tong_lon_nhat([-3, -1, -4])) ``` Kết quả là `(2, 5, 8)` và `(1, 1, -1)`. Khởi đầu bằng `a[0]` thay vì 0 bảo đảm dãy toàn số âm vẫn chọn một đoạn có thật. Mỗi lần tăng `cuoi`, chỉ cộng phần tử mới vào `tong`; hai vòng xét mọi đoạn, bậc thời gian `O(n²)`. Nếu nhiều đoạn cùng tổng lớn nhất, dấu `>` giữ đoạn đầu tiên tìm được. Đọc từ tệp có thể là mô-đun riêng; hàm này nhận dãy đã đọc và trả ba số để mô-đun báo kết quả dùng.

Bài luyện

Với `a = [2, -5, 4, 3, -1, 2, -6]`, đoạn chỉ số 2 đến 5 có tổng nào?
Chọn một đáp án

Bài luyện

`doan_tong_lon_nhat([-3, -1, -4])` trả đoạn nào?
Chọn một đáp án

Bài luyện

Vì sao vòng trong dùng `tong += a[cuoi]` khi tăng cuoi?
Chọn một đáp án

Đang học