Найдите последующую максимальную длину одновременно удовлетворяя двум ограничениям упорядочения
-
16-10-2019 - |
Вопрос
Нам дают набор $ f = {f_1, f_2, f_3,…, f_n } $ of $ n $ fruits. Каждый фрукт имеет цену $ p_i $ и витаминный контент $ v_i $; Мы связали фрукты $ f_i $ с упорядоченной парой $ (p_i, v_i) $. Теперь мы должны организовать эти фрукты таким образом, чтобы отсортированный список содержит цены в восходящем порядке и содержание витамина в порядке убывания.
Пример 1: $ N = 4 $ и $ f = {(2, 8), (5, 11), (7, 9), (10, 2) } $.
Если мы организуем список, так что вся цена находится в порядке возрастания и содержимого витамина в порядке убывания, то действительные списки являются следующими:
- $[(2, 8)]$
- $[(5, 11)]$
- $[(7, 9)]$
- $[(10, 2)]$
- $[(2, 8), (10, 2)]$
- $[(5, 11), (7, 9)]$
- $[(5, 11), (10, 2)]$
- $[(7, 9), (10, 2)]$
- $[(5, 11), (7, 9), (10, 2)]$
Из приведенных выше списков я хочу выбрать список максимального размера. Если более одного списка имеет максимальный размер, мы должны выбрать список максимального размера, сумма цены, наименьшая. Список, который должен быть выбран в приведенном выше примере, - $ {(5, 11), (7, 9), (10, 2) } $.
Пример 2: $ N = 10 $ и $$ f = {(99,10), (12,23), (34,4), (10,5), (87,11), (19,10), (90,18), (43,90), (13 100), (78,65) } $$
Ответ на этот пример экземпляр - $ [(13 100), (43,90), (78,65), (87,11), (99,10)] $.
До сих пор это то, что я делал:
- Сортировать оригинальный список в восходящем порядке по цене;
- Найти все последующие последствия отсортированного списка;
- Проверьте, действительна ли последующая, и сравните все действительные последующие последствия.
Однако это занимает экспоненциальное время; Как я могу решить эту проблему более эффективно?
Решение
Здесь будет работать динамическое программное решение, если содержимое витамина исходит из конечного набора (например, ограниченных целых чисел). Во -первых, сортируйте фрукты по повышению цены, а в случаях два или более фруктов имеют одинаковую цену, сортируйте их по содержанию витамина (спуска). Теперь определите $ m [f, v] $ как максимальное количество фруктов в сублистах, содержащих только последние фрукты (из списка отсортированного), имея содержание витаминов, не более чем $ v $. $ M [0, *] = 0 $ и $$ m [f, v] = begin {case} mathrm {max} {m [f-1, v], 1 + m [f-1, v_f ] } & text {if (v_f <= v )} m [f-1, v] & text {иное} end {case} $$ с использованием динамического программирования дает вам решение, которое Запускается в $ o ( text {количество фруктов} times text {возможные значения витамина}) $.