nikov писал(а):
Я поправил формулировку задачи. Мне надо максимизировать сумму модулей скачков. Ваш алгоритм для этого не совсем подходит. Например, после обнаруженного максимума (который мы объявляем новой начальной точкой) может быть маленький спуск вниз (меньше M), затем очень большой подъем вверх и новый максимум. Но мы его упустим, так как сейчас мы ищем минимум.
Э... вроде не совсем так. Я не писал, что мы ищем минимум, а максимумы нас не интересуют.. Я писал, что мы видим, что нашли максимум, поэтому предыдущий максимум удаляем (чтобы минимизировать число скачков), но новый по-любому добавляем. Можно здесь не удалять предыдущий минимум, но тогда ещё и первые разности перестанут быть знакопеременными, а сумма модулей скачков при этом не изменится.
Пусть, например, у нас M = 4. Вот, например, была последовательность:
0, -1, 1, 3, 2, 3, 2, 4, 5, 3, 4, 2, 3, 6, 5, 7, 9, 8, 10, 5, ...
Начинаем с 0 (добавляем в последовательность), ищем либо -4 и менее, либо 4 и более. Нашли 4. Оказался максимум. Добавляем 4 в посл-ть: (0, 4). Ищем либо 0 и менее, либо 8 и более. Наткнулись на 9. Видим, что опять максимум. Можно удалить предыдущую четвёрку, т.к. сумма модулей скачков от этого не изменится: |4-0|+|9-4| = |9-0|. Но следующая 5 - это уже минимум. Поэтому предыдущую девятку удалять нельзя, получается (0, 9, 5), и т.д.
Добавлено спустя 4 минуты 23 секунды:
Правда, мой алгоритм всё равно не без греха: в последовательности
0, 4, 5, 0, ...
он выделит (0, 4, 0), тогда как надо бы (0, 5, 0). Надо такие случаи учесть, но это легко скорректировать: когда нашли второй минимум (0), нужно ещё раз пробежаться и поправить предыдущий максимум.