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

Thực hành tìm dãy con tổng lớn nhất

Lưu trên thiết bị này
Chuyên đề lựa chọn CS: Chia để trị · Chọn bài khác

Khởi tạo tổng biên từ phần tử thật

```python def maxSubarray(A, left, right): if left > right: return None, None, float('-inf') if left == right: return left, right, A[left] mid = (left + right) // 2 sumL, maxL, total = A[mid], mid, 0 for i in range(mid, left - 1, -1): total += A[i] if total > sumL: sumL, maxL = total, i sumR, maxR, total = A[mid + 1], mid + 1, 0 for j in range(mid + 1, right + 1): total += A[j] if total > sumR: sumR, maxR = total, j sumX = sumL + sumR leftL, rightL, bestL = maxSubarray(A, left, mid) leftR, rightR, bestR = maxSubarray(A, mid + 1, right) if bestL >= bestR and bestL >= sumX: return leftL, rightL, bestL if bestR >= bestL and bestR >= sumX: return leftR, rightR, bestR return maxL, maxR, sumX ``` sumL ban đầu bằng A[mid], sumR bằng A[mid+1], nên đoạn chéo không lấy phía rỗng để tránh số âm. Các biến total=0 chỉ làm tổng đang cộng, không phải đáp án mặc định. Hàm so kết quả tốt nhất bên trái, bên phải và qua giữa rồi trả (chỉ số đầu,chỉ số cuối,tổng). Cơ sở một phần tử trả chính giá trị ấy. Miền rỗng trả (None,None,−∞) như tín hiệu không có đoạn; không dùng các chỉ số None để cắt dãy.

Đọc cả đoạn và kiểm tổng

Chạy: ```text python3 g11-cs-thuc-hanh-chia-de-tri.py tong "-4 5 -2 4 -6" python3 g11-cs-thuc-hanh-chia-de-tri.py tong "-7 -2 -5" ``` Lệnh đầu cần trả chỉ số(1,3), tổng 7, dãy con[5,−2,4]. Lệnh sau trả chỉ số(1,1), tổng −2, dãy con[−2]. Dùng A[left:right+1] để lấy đủ biên cuối và kiểm tổng các phần tử ấy. Thử thêm dãy rỗng, một phần tử, toàn số 0 và dãy tăng/giảm. Nếu có nhiều đoạn tối ưu, chỉ cần một đoạn liên tục hợp lệ có tổng lớn nhất; không buộc kết quả khớp một vị trí duy nhất khi đề chưa ràng buộc. Mỗi mức giải cả hai nửa và quét qua đoạn để tính tổng chéo, nên T(n)=2T(n/2)+O(n) và bậc O(n log n). Chỉ số là vị trí, còn tổng là giá trị; cần kiểm cả hai để tránh kết quả tổng đúng nhưng đoạn bị lấy sai.

Bài luyện

Hàm trả (1,3,7) trên dãy mẫu. Lát cắt lấy đúng dãy con là gì?
Chọn một đáp án

Bài luyện

Vì sao sumL cần khởi tạo từ A[mid] thay vì coi 0 là đáp án sẵn có?
Chọn một đáp án

Bài luyện

Khi đầu vào rỗng và hàm trả (None,None,−∞), cách xử lí nào đúng?
Chọn một đáp án

Đang học