Кажется, что проблема может быть решена простым жадным алгоритмом.
Для каждой записи массива создайте интервал с полями start
и finish
(a[i].start = i-arr[i] etc
)
Сортировка интервалов по полю начала.
Найдите интервал с самым правым finish
среди тех, которые охватывают 0, сделайте maxx=a[i].finish
.
Сканируйте интервалы с start
в 0..maxx
диапазоне, выберите один с самым правым finish
.
Продолжить.
Быстрая реализация Python (возможно, потребуется еще несколько проверок)
ar = [2,2,1,3,2,1,4,4]
n = len(ar)
a = [(max(0, i-ar[i]), min(i+ar[i], n-1)) for i in range(n)]
print(ar)
a.sort()
print(a)
cnt = 0
maxx = -1
left = 0
i = 0
while i < n and maxx < n - 1:
while i < n and a[i][0] <= left and maxx < n - 1:
maxx = max(a[i][1], maxx)
i+=1
print("maxx ", maxx)
left = maxx
cnt += 1
print("cover ", cnt)
[2, 2, 1, 3, 2, 1, 4, 4]
[(0, 2), (0, 3), (0, 6), (1, 3), (2, 6), (2, 7), (3, 7), (4, 6)]
maxx 6
maxx 7
cover 2