Добрый день.
Ещё давно я столкнулся с задачей, которую не могу решить до сих пор, отчего пришёл сюда за помощью.
Для начала поставлю саму задачу. Предыстория, с которой она подаётся, значения не имеет.
Дана матрица
размера
, элементами которой являются натуральные числа. Требуется найти такое подмножество
, что:
а)
б)
в)
Ясно, что множество индексов
является композицией числа
. Поэтому первым абстрактным решением является генерация композиций числа
, являющихся номерами строк, откуда взяты элементы
. Затем последовательно, для каждого слагаемого ищем максимальный элемент в соответствующей стоке, из незадействованного ранее столбца. Но в силу ограничений на
такой брутальный алгоритм не пройдёт, что ежу понятно. Да и динамикой тут не пахнет. Можно задумать о том, что в композициях слагаемые упорядочены, поэтому, для ускорения работы программы можно попробовать рассмотреть всё то же множество индексов
уже как разбиение числа
. Но тогда нужно применять какую-то эвристику, чтобы понять, в каком порядке рассматривать строки, в поисках максимального элемента. Но и в этом случае динамики в решении не наблюдается, и оно далеко не оптимально.
Если задуматься о том, что задача отнесена в группу "Динамическое программирование", то можно попытаться "плясать от этого". Но тогда встаёт вопрос "Какую подзадачу выбрать"? Решать сперва подзадачу для матрицы
не вариант, так как с добавлением столбца мы получаем новую задачу, для решения которой нельзя использовать решение предыдущей подзадачи. Можно сначала рассмотреть матрицу
, но тогда не очевидно как использовать решение подзадачи.
В общем я попал вот в такой тупик. ДП никогда не было моей сильной стороной, так что я вполне мог упустить что-то, или сделать неверный вывод. Если можно - очень хочется получить указание на ошибку в рассуждениях, или намёк на то, в каком направлении капать.
Спасибо!