Первое, что нужно понять, это то, что по количеству нет разницы между потерянными солдатами и оставленными солдатами. Таким образом, мы можем уменьшить свойства замка до солдат, потерянных и необходимых.
Второе, что нужно понять, это то, что если вы спуститесь по ветке дерева, вы должны завершить всю ветку для возвращения. Это позволяет нам сократить всю ветвь до единого «мегамолка» с необходимыми потерянными солдатами.
Итак, предполагая, что мы можем вычислить стоимость веток, у нас остаются две проблемы: с чего начать и как выбрать, какую ветку спустить первой. Я просто собираюсь форсировать стартовую позицию, но, возможно, будет лучше. Выбор ветви для спуска немного сложнее. Количество погибших солдат тривиально, а необходимое количество - нет. Нет! возможности, поэтому мы не можем просто попробовать их все.
Вместо того, чтобы думать о том, сколько солдат потеряно / требуется в каждом замке, я собираюсь вернуться назад. Начните с 0 солдат и добавляйте их, когда вы нападаете на замок, чтобы у нас было как минимум необходимое количество. Есть два случая: либо есть замок, для которого мы выполняем требование, либо нет. Если есть, (не) сделать этот замок (это оптимально, потому что мы использовали минимальное количество солдат). Если нет, добавьте еще одного солдата и попробуйте снова (это оптимально, потому что мы должны добавить солдата, чтобы продолжить). Теперь это должно стать очевидным: мы хотим (не) делать замок с требованиями, ближайшими к числу, потерянному первым. Просто отсортируйте (требуется минус потерян), и это ваш заказ.
Итак, окончательный алгоритм выглядит так:
- Грубая сила, отправная точка
- Рекурсивно уменьшать ветви в замки с заполнителями (запомните этот результат для других начальных точек)
- Посещение веток в порядке убывания (обязательно за вычетом потерь).
Время выполнения - O (n * c ^ 2 * lg (c)), где n - количество замков, а c - максимальное соединение любого отдельного замка. Это еще хуже, потому что существует не более n c 'ветвей', а узлу требуется не более c lg (c) времени для оценки после оценки его ветвей. [Ветви и узлы вычисляются не более одного раза благодаря запоминанию]
Я думаю, что можно добиться большего успеха, но я не уверен, как.