Большое редактирование: Честно говоря, я не думаю, что есть способ оценить матрицу и определить, максимизирована ли она, если только она не является полностью положительной.
Может быть, ему нужно разветвиться и понять все пути исключения. Вы никогда не отказываетесь, когда дорогостоящее исключение сделает возможным несколько лучших устранений позже. Мы можем замкнуть накоротко, если найден теоретический максимум, но, кроме любого алгоритма, нужно будет шагать вперед и назад. Я адаптировал свое оригинальное решение для достижения такого поведения с помощью рекурсии.
Двойной секрет Редактировать: Было бы также значительно уменьшить сложность, если бы на каждой итерации не нужно было найти все отрицательные элементы. Учитывая, что между вызовами они не сильно меняются, имеет смысл просто передать свои позиции следующей итерации.
Принимает матрицу, список текущих отрицательных элементов в матрице и теоретический максимум исходной матрицы. Возвращает максимальную сумму матрицы и список ходов, необходимых для ее достижения. На мой взгляд, список ходов содержит список ходов, обозначающих строку / столбец, удаленный из результата предыдущей операции.
То есть: r1, r1
переведет
-1 1 0 1 1 1
-4 1 -4 5 7 1
1 2 4 ===>
5 7 1
Возвращает, если сумма матрицы является теоретическим максимумом
Найти позиции всех отрицательных элементов, если не был передан пустой набор.
Вычислить сумму матрицы и сохранить ее вдоль пустого списка ходов.
Вернуть сохраненную сумму и переместить список.
Я не уверен, лучше ли это или хуже, чем метод грубой силы, но теперь он обрабатывает все тесты. Даже те, где максимум содержит отрицательные значения.