ОК, сначала пример в двух измерениях:
1 2 3
1 2 3 4
5 6 7 8
7 8 9 10
Вы начинаете в верхнем левом углу, очевидно, и помещаете значение в список результатов. Затем вам нужно добавить все доступные для этого кандидаты (увеличивая ровно один индекс) оттуда до некоторой сортированной коллекции, то есть ячеек со значениями 3 и 6. Затем вы берете самый низкий член из этой коллекции. , поместите его значение в список результатов, добавьте в него всех доступных кандидатов, которых еще нет в коллекции, и т. д.
Вам понадобится:
- структура данных, содержащая кандидата, со всеми индексами и значением результата (я представляю это ниже как "
((i1 i2) value)
").
- структура данных для набора кандидатов, отсортированная по значению. Куча кажется идеальной для этого.
Вы должны будете убедиться, что все кандидаты уникальны по своим показателям, когда вы кладете их в коллекцию. Значения не обязательно уникальны, но куча должна быть отсортирована по ним. Поскольку заданный набор индексов всегда выдает одно и то же значение, вам придется проверять уникальность индексов только при обнаружении этого значения при вставке в кучу. Это может быть оптимизация, чтобы сделать узлы кучи не отдельными кандидатами, а списком кандидатов с одинаковым значением.
Делаем это с приведенным выше примером: во-первых, список результатов (2). Кандидатами являются ((1 2) 3) и ((2 1) 6). Возьмите кандидата с наименьшим значением, поместите значение в список результатов -> (2 3), найдите координаты всех новых кандидатов -> (2 2) и (1 3), вычислите их значения -> ((2 2) ) 7) и ((1 3) 4), поместите их в кучу кандидатов (сериализованное представление здесь) -> ((1 3) 4) ((2 1) 6) ((2 2) 7), мыльная пена, промыть, повторить.
В табличной форме:
result-list candidates
(2) ((1 2) 3) ((2 1) 6)
(2 3) ((1 3) 4) ((2 1) 6) ((2 2) 7)
(2 3 4) ((2 1) 6) ((2 2) 7) ((2 3) 8)
(2 3 4 6) ((2 2) 7) ((3 1) 8) ((2 3) 8)
(2 3 4 6 7) ((3 1) 8) ((2 3) 8) ((3 2) 9)
(2 3 4 6 7 8) ((2 3) 8) ((3 2) 9)
(2 3 4 6 7 8 8) ((3 2) 9) ((3 3) 10)
(2 3 4 6 7 8 8 9) ((3 3) 10)
(2 3 4 6 7 8 8 9 10)
Я не вижу лучшего способа в данный момент. Похоже, что для кучи требуется количество узлов по величине суммы n1, n2 и n3.