Во-первых, давайте посмотрим на вопрос,
Цирк проектирует башенную рутину, состоящую из людей, стоящих поверх друг друга плечи. По практическим и эстетическим причинам каждый человек должен быть как короче, так и легче, чем человек ниже него или нее. Учитывая высоты и веса каждого человека в цирке, напишите способ вычисления максимально возможного числа людей в такой башне.
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. Найдите самую длинную последовательность который содержит увеличение высоты и увеличивая вес. Для этого мы:
-
a) Начните с начала последовательность. В настоящее время max_sequence пустой.
-
b) Если для следующего элемента, высота и вес не больше чем в предыдущем пункте, мы отметьте этот элемент как "непригодный"
c) Если найденная последовательность содержит больше предметов, чем "max sequence", он становится "max последовательность ".
-
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)" вместо сравнения текущего элемента с последним в seq?
Предположим, что список сортировки равен (1, 5), (2, 1), (2, 2), на основе функции fillNextSeq,
сначала (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).
Спасибо