Вам нужно вырезать палку длиной l
на несколько частей. Разрезы должны выполняться в местах c1, c2, c3, ..., cn
, где ci
- целое число между 1
и n-1
(включительно). Стоимость разреза равна длине палки, на которой она изготовлена. Каким должен быть порядок сокращений, чтобы минимизировать общую стоимость операции?
Например, рассмотрите палку длиной 10
, и разрезы должны быть сделаны в местах 2, 4, 7
. Вы можете вырезать палочки в указанном порядке. Первый разрез стоил бы 10
, так как палка имела длину 10
. Второй разрез стоил бы 8
, так как оставшаяся палка, на которой сделан разрез, имеет длину 10 - 2 = 8
. Последний разрез стоил бы 6
, так как длина оставшейся палки 10 - 4 = 6
. Общая стоимость 10 + 8 + 6 = 24
Но если мы вырезаем палку в порядке: 4, 2, 7
, мы получим стоимость 10 + 4 + 6 = 20
, которая лучше для нас.
Создайте алгоритм для решения проблемы.
Я уверен, что это проблема DP. Тщательное рекуррентное отношение, которое я мог видеть, состояло в том, что, если мы разрезаем палку, мы получаем две меньшие палочки. Если мы знаем оптимальное решение для этих двух палочек, мы можем легко найти оптимальное решение для большей палочки. Но это было бы очень неэффективно.
Если у вас есть рекурсивная функция min_cost(stick_length, c_1, c_2, ..., c_n)
, которая возвращает минимальную стоимость вырезания палки длиной stick_length
в c_1, c_2, ..., c_n
, отношение повторения будет выглядеть примерно так:
min_cost(stick_length, c_1, c_2, ..., c_n) =
stick_length
+ minimum(min_cost(c_1, a_1, a_2, ..., a_i)
+ min_cost (stick_length - c_1,
a_(i+1), ..., a_(n-1)),
min_cost(c_2, a_1, a_2, ..., a_i)
+ min_cost(stick_length - c_2,
a_(i+1), ..., a_(n-1)), ... ,
min_cost(c_n, a_1, a_2, ..., a_i)
+ min_cost(stick_length - c_n,
a_(i+1), ..., a_(n-1)))`,
где a_1, a_2, ..., a_n
- это перестановка остальных мест, подлежащих разрезанию. Нам придется передать все возможные перестановки в функцию повторения, а не только одну, как я написал.
Это, очевидно, непрактично. Как я могу это решить?