Учитывая две команды, мы можем сказать, могут ли обе быть на картине вместе, и если да, то какая из них впереди. Как говорит @typewriter, это приводит к частичному порядку. Этот частичный порядок может быть представлен в виде ациклического c ориентированного графа.
На данный момент мы можем применить любой известный алгоритм Топологическая сортировка для получения линейного порядка.
И теперь мы обрабатываем команды в таком порядке и храним следующие две части информации для каждой команды:
Сколько команд может быть перед этим на картинке ?
Какова следующая команда перед ними на этом максимальном изображении?
(Мы определяем это, выбирая предыдущую команду, которая может быть в той же картине с максимально возможной картиной. Мы помечаем это как следующую команду, и эта команда может иметь еще одну команду в картине. Это пример динамического алгоритма программирования c.
Когда мы закончим обработку всего списка, ищите команду, в которой может быть больше команд. А затем просмотрите структуру данных, чтобы выяснить, какие команды должны быть на рисунке.
Если есть N команд из M игроков, этот алгоритм должен работать в O((N + log(M)) * N * M)
. Бит O(log(M) * N * M)
относится к N
видам отдельных команд. Бит O(N^2 * M)
- это поиск всех парных сравнений команд. Топологическая сортировка и динамический бит программирования c быстры относительно второго шага.