Во-первых, давайте рассмотрим вопрос,
Цирк разрабатывает башню, состоящую из людей, стоящих друг на друге. плечи. По практическим и эстетическим соображениям каждый человек должен быть и ниже, и легче человека ниже его или ее. Учитывая рост и вес каждого человека в цирке, напишите метод для вычисления максимально возможного количества людей. в такой башне.
EXAMPLE:
Input:
(ht, wt): (65, 100) (70, 150) (56, 90) (75, 190) (60, 95) (68, 110)
Output: The longest tower is length 6 and includes from top to bottom:
(56, 90) (60,95) (65,100) (68,110) (70,150) (75,190)
Но я не совсем понимаю решение следующего:
Предлагаемое решение по книге:
Шаг 2. Найдите самую длинную последовательность который содержит увеличивающуюся высоту и увеличение веса. Для этого мы:
a) Начнем с начала
последовательность. В настоящее время max_sequence
пусто.
b) Если для следующего элемента
рост и вес не больше
чем в предыдущем пункте, мы
отметьте этот элемент как «непригодный»
c) Если найденная последовательность содержит больше элементов, чем «Максимальная последовательность» становится «макс. последовательность".
г) После этого поиск
повторяется из «непригодного товара»,
пока мы не дойдем до конца
исходная последовательность.
public class Question {
ArrayList items;
ArrayList lastFoundSeq;
ArrayList maxSeq;
/ Возвращает более длинную последовательность
ArrayList seqWithMaxLength (ArrayList seq1, ArrayList seq2) {
вернуть seq1.size ()> seq2.size ()? seq1: seq2;
}
// Заполняет следующую последовательность с уменьшенной массой и возвращает индекс 1-го непригодного элемента.
int fillNextSeq (int startFrom, ArrayList seq) {
int firstUnfitItem = startFrom;
if (startFrom nextSeq = новый ArrayList ();
int nextUnfit = fillNextSeq (currentUnfit, nextSeq);
maxSeq = seqWithMaxLength (maxSeq, nextSeq);
если (nextUnfit == currentUnfit)
сломать;
еще
currentUnfit = nextUnfit;
}
}
}
Вопрос,
1> каково использование функции fillNextSeq? 2> зачем проверять «items.get (i-1) .isBefore (item)», а не сравнивать текущий элемент с последним в seq?
Предположим, что список сортировки равен (1, 5), (2, 1), (2, 2), на основе функции fillNextSeq,
first (1, 5) будет вставлен в последовательность. Тогда элемент (2, 1) не будет помещен в последовательность b / c, вес (2,1) меньше, чем (1, 5). Затем, поскольку (2, 1) стоит перед (2, 2), то (2, 2) будет помещено в последовательность.
Теперь последовательность содержит (1, 5) и (2, 2), что является неверно b / c вес (1, 5) больше, чем вес (2, 2).
Спасибо