Cho mảng A N phần tử, và hai số l, r (1 ≤ a[x] ≤ 10⁵, 1 ≤ l ≤ r ≤ N). Lấy phần tử a[x] xóa nó, đồng thời xóa tất cả phần tử bằng a[x]+1...a[x]+r và a[x]-1...a[x]-l. Chi phí = a[x] điểm. Tối đa hóa tổng chi phí sau khi xóa hết mảng.
Ví dụ: A = [2,4,3,10,5], l = 1, r = 2 → Kết quả: 18.
Thuật toán Dynamic Programming
- Tìm
max_val= max(A). count_list[v]= tần suất giá trị v trong A.res[v]= điểm tối đa cho các giá trị ≤ v.- Quy hoạch:
res[num] = max(res[num-1], num * count_list[num] + res[max(num - l - 1, 0)]). - Trả về
res[max_val].
Ví dụ code
def get_max_cost(array, left, right):
n = len(array)
max_val = max(array)
count_list = [0] * (max_val + 1)
for v in array:
count_list[v] += 1
res = [0] * (max_val + 1)
left = min(left, right)
for num in range(1, max_val + 1):
k = max(num - left - 1, 0)
res[num] = max(res[num - 1], num * count_list[num] + res[k])
return res[max_val]
array = [2, 4, 3, 10, 5]
left = 1
right = 2
print(get_max_cost(array, left, right))
Input
[2, 4, 3, 10, 5], 1, 2
Output
18