Вот идея:
Рассмотрим следующий график: создайте узел для каждого интервала.Если интервал I1 и интервал I2 не перекрываются и I1 предшествует I2, добавьте направленное ребро от узла I1 к узлу I2.Обратите внимание, что этот график ацикличен.Каждый узел имеет стоимость, равную длине соответствующего интервала.
Теперь идея состоит в том, чтобы найти самый длинный путь в этом графе, который можно найти за полиномиальное время для ациклических графов (используя динамическое программирование дляпример).Проблема в том, что затраты находятся в узлах, а не в краях.Вот хитрость: разбить каждый узел v на v 'и v' '.Все ребра, входящие в v, теперь будут вводить v ', а все ребра, выходящие из v, теперь будут выходить из v' '.Затем добавьте ребро из v 'в v' 'со стоимостью узла, в данном случае длиной интервала.Все остальные ребра будут стоить 0.
Ну, если я не ошибаюсь, самый длинный путь на этом графике будет соответствовать множеству непересекающихся интервалов с максимальной суммой.