Постановка задачиRod резка - Динамическое программирование
Проблема стержневой резки заключается в следующем. Учитывая стержень длины n
дюймов и таблицу цен Pi
для i = 1, 2, 3,....n
, определите максимальный доход Rn
, получая возможность разрезания стержня и продажи кусков. Обратите внимание, что если цена Pn
для стержня длиной n
достаточно велика, оптимальное решение может вообще не требовать резки.
Рассмотрите случай, когда n=4
. На рисунке показаны все способы разрезания стержня длиной 4 дюйма, в том числе и без разрезов. Мы видим, что резка 4-дюймового стержня на две 2-дюймовые части дает доход P2+P2=5+5=10
, что является оптимальным.
Ниже код является восходящим подходом строительного раствора для штоковой резки.
for (i = 1; i<=n; i++)
{
int q = INT_MIN;
for (j = 0; j < i; j++)
q= max(q, p[j] + r[i-j-1]);
r[i] = q;
}
return val[n];
Зачем нам нужен вспомогательный массив r[n+1]
? Не удалось ли решить проблему, используя только массив p
? Используется ли это потому, что мы не можем получить доступ к p [-1] при резке длины стержня n и 0? Почему мы используем q = max(q, p[j] + r[i-j-1])
, когда p не обновлен до новых значений?
Пожалуйста, включите определение проблемы вырезания стержня, чтобы избежать недоразумений. – Codor
Добавил его к примеру. –
«-1» во внутреннем цикле меня немного озадачивает. – Codor