Đ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?
4+3 mới là 7, còn hai phần tử sau.
4+3−1+2=8.
Chưa đúng phép cộng.
Không phải tổng bốn phần tử ấy.
Lời giải
Đoạn liên tiếp từ 2 đến 5 chứa 4, 3, -1, 2; cộng được 8.
Bài luyện
`doan_tong_lon_nhat([-3, -1, -4])` trả đoạn nào?
Bài yêu cầu ít nhất một địa điểm.
Tổng -8 nhỏ hơn -1.
Trong các đoạn không rỗng, -1 là tổng lớn nhất.
-4 nhỏ hơn -1.
Lời giải
Dãy toàn âm vẫn phải chọn một đoạn có thật; một phần tử -1 ở chỉ số 1 cho tổng lớn nhất.
Bài luyện
Vì sao vòng trong dùng `tong += a[cuoi]` khi tăng cuoi?
Mỗi lượt chỉ thêm giá trị tại đầu cuối mới.
Số âm ở giữa vẫn được cộng.
Mã không đổi thứ tự.
Vòng trong xét cả đoạn dài hơn một.
Lời giải
Khi kéo dài đoạn thêm một vị trí, tổng mới bằng tổng cũ cộng a[cuoi], nên mọi đoạn từ dau được xét mà không cộng lại cả đoạn.
Đang học