Mô tả bài toán
Cho danh sách nums và số k. Xét danh sách lớn là nums lặp lại k lần. Tìm tổng lớn nhất của một danh sách con liên tiếp trong danh sách lớn đó.
Ví dụ: nums = [2, 4, 5, -4], k = 1 → đầu ra 11 (sublist [2,4,5]).
Giải thuật (Kadane mở rộng cho mảng lặp)
- Khởi tạo
s = ans = lo = 0. - Lặp
min(k, 2)lần: duyệt quanums, cập nhậts,lo = min(lo, s),ans = max(ans, s - lo). - Trả về
ans + max(0, sum(nums)) * max(0, k-2).
Ví dụ mã Python
class Solution:
def solve(self, nums, k):
s = ans = lo = 0
for _ in range(min(k, 2)):
for x in nums:
s += x
lo = min(lo, s)
ans = max(ans, s - lo)
return ans + max(0, sum(nums)) * max(0, (k - 2))
ob = Solution()
nums = [2, 4, 5, -4]
k = 1
print(ob.solve(nums, k))
Đầu vào
[2, 4, 5, -4], 1
Đầu ra
11