Во-первых, давайте посмотрим на вопрос,
Цирк проектирует башенный режим, состоящий из людей, стоящих друг над другом
плечи. По практическим и эстетическим соображениям каждый человек должен быть короче и легче человека ниже его или ее. Учитывая рост и вес каждого человека в цирке, напишите метод расчета максимально возможного числа людей.
в такой башне.
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)
Но я не совсем понимаю решение следующим образом:
Предлагаемое решение по книге:
- Шаг 1. Сортировка всех элементов по высоте
сначала, а потом по весу. Это означает
что если все высоты уникальны,
тогда элементы будут отсортированы по
их рост. Если высоты
то же самое, элементы будут отсортированы по
вес. Пример: »» Перед сортировкой:
(60, 100) (70, 150) (56, 90) (75,
190) (60, 95) (68 110). "После
сортировка: (56, 90), (60, 95),
(60 100), (68, 110), (70 150),
(75190).
Шаг 2. Найдите самую длинную последовательность
который содержит увеличение высоты и
увеличение веса. Для этого мы:
а) Начало в начале
последовательность. В настоящее время max_sequence
пустой.
b) Если для следующего элемента,
рост и вес не больше
чем у предыдущего пункта, мы
пометить этот товар как «непригодный»
в) Если
В найденной последовательности больше элементов, чем
«Макс. Последовательность» становится «Макс.
последовательность".
d) После этого поиск
повторяется из «непригодного предмета»,
пока мы не достигнем конца
оригинальная последовательность.
public class Question {
ArrayList<HtWt> items;
ArrayList<HtWt> lastFoundSeq;
ArrayList<HtWt> maxSeq;
/ Returns longer sequence
ArrayList<HtWt> seqWithMaxLength(ArrayList<HtWt> seq1, ArrayList<HtWt> seq2) {
return seq1.size() > seq2.size() ? seq1 : seq2;
}
// Fills next seq w decreased wts&returns index of 1st unfit item.
int fillNextSeq(int startFrom, ArrayList<HtWt> seq) {
int firstUnfitItem = startFrom;
if (startFrom < items.size()) {
for (int i = 0; i < items.size(); i++) {
HtWt item = items.get(i);
if (i == 0 || items.get(i-1).isBefore(item)) {
seq.add(item);
} else {
firstUnfitItem = i;
}
}
}
return firstUnfitItem;
}
// Find the maximum length sequence
void findMaxSeq() {
Collections.sort(items);
int currentUnfit = 0;
while (currentUnfit < items.size()) {
ArrayList<HtWt> nextSeq = new ArrayList<HtWt>();
int nextUnfit = fillNextSeq(currentUnfit, nextSeq);
maxSeq = seqWithMaxLength(maxSeq, nextSeq);
if (nextUnfit == currentUnfit)
break;
else
currentUnfit = nextUnfit;
}
}
}
Вопрос
1> для чего используется функция fillNextSeq?
2> Зачем проверять «items.get (i-1) .isBefore (item)», а не сравнивать текущий элемент с последним в последующем?
Предположим, что список сортировки (1, 5), (2, 1), (2, 2) основан на функции fillNextSeq,
first (1, 5) будет вставлен в последовательность. Тогда пункт (2, 1) не будет вставлен в последовательность, б / с вес (2,1) меньше, чем (1, 5). Далее, поскольку (2, 1) раньше, чем (2, 2), поэтому (2, 2) будут вставлены в последовательность.
Теперь последовательность содержит (1, 5) и (2, 2), что неверно, т.к. вес (1, 5) больше, чем (2, 2).
Спасибо