Я недавно начал изучать динамическое программирование, и я нашел следующий вопрос:Выбор вино динамического программирование
Представьте, что вы едите коллекцию вин N, расположенные рядом друг с другом на полке. Для простоты, давайте укажем вин слева направо, поскольку они стоят на полке с целыми числами от 1 до N соответственно. Цена i-го вина - пи (цены на разные вина могут быть разными).
Поскольку вина становятся лучше с каждым годом, предположим, что сегодня это год 1, в год y цена i-го вина будет y * pi, то есть y-times значение, которое в текущем году.
Вы хотите продать все вина, которые у вас есть, но вы хотите продать ровно одно вино в год, начиная с этого года. Еще одно ограничение - каждый год вам разрешается продавать только крайнее левое или самое правое вино на полке, и вам не разрешается переупорядочивать вина на полке (т.е. они должны оставаться в том же порядке, что и в начале).
Вы хотите узнать, какая максимальная прибыль вы можете получить, если вы продаете вина в оптимальном порядке.
Ответ переходит сверху вниз подход, и я хотел, чтобы создать подход снизу вверх. Вот как я определил проблему:
F (L, R) является функция прибыли в результате выбора вина из указанного левого и правого указателя
INPUT: р массив цен на (год + 1), год * p [r] + F (l, r) * (год + 1, r) * (год + 1), год * p [r] + F (l, r- 1) * (год + 1))
ограничение: L + R < = Len (р)
Я создал следующий код Python для решения проблемы
def wine(Price):
length = len(Price)
DP = [[0] * (length+1) for _ in range(length+1)]
for y in range(1,length+1): #Or can be range(length, 0, -1):
for l in range(0, length):
for r in range(length-1, -1, -1):
if l+r <= length:
DP[l][r] = max(y * Price[l] + DP[l+1][r] * (y+1), \
y * Price[r] + DP[l][r-1] * (y+1))
return DP
Я установил массив цены на [2,3,5,1,4]. Источник предполагает, что Макс. Прибыль - 50. Однако я не могу идентифицировать это значение с кодом, который я написал. Может ли кто-нибудь помочь в выявлении проблемы с моей логикой?
Большое спасибо, быстрый вопрос: Могли ли мы знать, какое значение будет иметь максимальное значение без проверки матрицы? – HidingInTheBush
Несомненно. Мы можем добавить переменную до цикла ('max_value = 0') и обновить ее в конце каждой итерации (' max_value = max (max_value, DP [l] [r] ').Однако я ожидал бы, что проверка значений по главной диагонали (т. Е. В прошлом году) будет быстрее: 'max (DP [-i] [i] для i в диапазоне (len (цена) +1))' – Marat