Пожалуйста, прочтите новое правило об ограничении использования AI-инструментов. ×

Блог пользователя AlexSam

Автор AlexSam, история, 8 лет назад, По-русски

Добрый день всем,

я пытаюсь постепенно повышать свой уровень в алгоритмах и структурах данных, немотря на то, что вуз уже закончил и практикую программирование. И вот, на практике, столкнулся с задачей, которую не могу решить оптимально, возможно, сообщество сможет что-то подсказать. В общем в чём суть. У нас есть прямоугольная таблица, каждая ячейка её, характеризуется свойством. Надо разбить эту таблицу на минимальное количество прямоугольных областей, в которых данное свойство будет одинаково. Области могут пересекаться. На выходе мы должны получить координаты левого верхнего угла области, а также ширину и высоту Каждой области. Например,что-то вроде такого (свойство заменено цифрой).

Входные данные

5 7
1 1 1 1 2 2 2
1 1 1 1 2 2 2
1 1 1 1 2 2 2
1 1 1 1 2 2 2
1 1 1 1 2 2 2

Выходные данные

2
1 1 5 4
1 5 5 3

Думал о том, что бы представить данную таблицу в виде графа, но как модифицировать его обход, даже не представляю. Возможно, у сообщества появятся какие-то идеи. Возможно, просто посоветуете, в сторону каких алгоритмов мне следует копать.

  • Проголосовать: нравится
  • +38
  • Проголосовать: не нравится

»
8 лет назад, # |
  Проголосовать: нравится +22 Проголосовать: не нравится

Добрый день!

Задача клевая, вот такие надо давать на контестах ;)

Что значит оптимально? Вы хотите решение за n^2 или здесь слово оптимально подразумевает в себе точное решение, а не приближенное?

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Сейчас прикидывал выходные данные. Суммарное количество ячеек не превышает 10^5.

    Под словом "оптимально" я понимал наименьшую временную сложность. Квадрат вполне подходит.

    И рад, что задача вам понравилась)

    • »
      »
      »
      8 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится

      Квадрат не то что подходит — лучшего решения не существует (но это не значит, что существует квадратичное).

»
8 лет назад, # |
  Проголосовать: нравится +17 Проголосовать: не нравится

На тимусе есть почти такая задача (http://acm.timus.ru/problem.aspx?space=1&num=1548, как решать не знаю.

  • »
    »
    8 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Ага... задача схожа. Осталось найти кого-то, кто умеет такие решать. Спасибо.

    • »
      »
      »
      8 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      По идее, это задача о покрытии множества (которая в общем случае NP-полная). В данном конкретном экземпляре несложно понять, что достаточно рассмотреть всего O(N2) различных прямоугольников (все оптимальные прямоугольники однозначно задаются левым и правым краями) и что ответ будет не больше N.

      Моё чутьё говорит, что здесь либо сдаётся хороший перебор с доказанной асимптотикой (вида O(2N / 2 * poly(N))), либо задача сводится к чему-то решаемому за полиномиальное время.