Давайте сначала попробуем решить эту проблему в 2-D:
скажем, у вас есть прямоугольники с X и Y, и вопрос аналогичен (самая высокая башня, но на этот раз вам нужно беспокоиться только об одном базовом измерении).
Итак, сначала вы просматриваете всю коллекцию, дублируя каждый прямоугольник, поворачивая его на 90 градусов (меняя местами X и Y), за исключением квадратов (где X (1) = X (2) && Y (1) = Y (2)) , это представляет все возможные варианты.
затем вы сортируете их по их X-стороне, от самой большой до самой маленькой. в случае дублирования значения X вы удаляете значение с более низким значением Y.
тот же принцип, применяемый в трехмерном сценарии, только теперь вы НЕ МОЖЕТЕ просто умножить размер коллекции на 6 (все возможные варианты W, H, D), а на 2. вы делаете это, отклоняя все варианты, где ширина меньше, чем глубина (поэтому для каждого i, W (i)> = D (i)), а затем отбрасывается отклонение, при котором высота не является ни самой высокой, ни самой низкой из трех измерений (потому что другие два варианта могут идти один поверх другого, и этот не может присоединиться). опять же, вы также отклоняете дубликаты (где W (1) = W (2) && H (1) = H (2) && D (1) = D (2)).
Затем вы должны отсортировать по ширине, только на этот раз вы не выбрасываете варианты с одинаковой шириной (потому что один может поместиться в башне, а другой нет), тогда вы можете использовать алгоритм LIS, как описано выше в @IVlad:
D[1] = h(1);
D[i] = h(i) + max(D[j] | j <= i and we can put tower i on tower j) or simply h(i) if no such D[j] exists.
хитрость была в том, что вы знаете, что ширина самая длинная из двух, поэтому вы знаете, что первый элемент не помещается поверх любого более позднего элемента.