Учитывая 2 массива неотрицательных чисел, найдите минимальную сумму произведений
даны два массива A
и B
, содержащих n
неотрицательные числа, удалить a>0
элементы с конца A и b>0
элементы с конца B. оцените стоимость такой операции, как X*Y
здесь X
- сумма a
элементы удалены от A
и Y
в сумме b
элементы удалены от B
. Продолжайте делать это, пока оба массива пусты. Цель состоит в минимизации общей стоимости.
С помощью динамической программирование и тот факт, что оптимальная стратегия всегда будет иметь ровно один элемент либо A
или B
Я могу найти решение O(n^3). Теперь мне интересно узнать, есть ли еще более быстрое решение этой проблемы?
EDIT: Кража примера из @recursive в комментариях:
A = [1,9,1] и B = [1, 9, 1]. Возможно сделать со стоимостью 20. (1) * (1 + 9) + (9 + 1) * (1)
1 ответов
здесь O(n^2)
. Пусть CostA(i, j)
минимальная стоимость устранения A[1..i], B[1..j]
таким образом, что первое удаление занимает только один элемент B
. Пусть CostB(i, j)
минимальная стоимость устранения A[1..i], B[1..j]
таким образом, что первое удаление занимает только один элемент A
. У нас есть взаимно рекурсивные повторы
CostA(i, j) = A[i] * B[j] + min(CostA(i - 1, j),
CostA(i - 1, j - 1),
CostB(i - 1, j - 1))
CostB(i, j) = A[i] * B[j] + min(CostB(i, j - 1),
CostA(i - 1, j - 1),
CostB(i - 1, j - 1))
с базовыми корпусами
CostA(0, 0) = 0
CostA(>0, 0) = infinity
CostA(0, >0) = infinity
CostB(0, 0) = 0
CostB(>0, 0) = infinity
CostB(0, >0) = infinity.
ответ min(CostA(n, n), CostB(n, n))
.