Найдите как можно большее количество людей в такой башне

Во-первых, давайте рассмотрим вопрос,

Цирк разрабатывает башню, состоящую из людей, стоящих друг на друге. плечи. По практическим и эстетическим соображениям каждый человек должен быть и ниже, и легче человека ниже его или ее. Учитывая рост и вес каждого человека в цирке, напишите метод для вычисления максимально возможного количества людей. в такой башне.

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), (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).

Спасибо

15
задан q0987 17 December 2010 в 20:58
поделиться