Добрый день всем,
я пытаюсь постепенно повышать свой уровень в алгоритмах и структурах данных, немотря на то, что вуз уже закончил и практикую программирование. И вот, на практике, столкнулся с задачей, которую не могу решить оптимально, возможно, сообщество сможет что-то подсказать. В общем в чём суть. У нас есть прямоугольная таблица, каждая ячейка её, характеризуется свойством. Надо разбить эту таблицу на минимальное количество прямоугольных областей, в которых данное свойство будет одинаково. Области могут пересекаться. На выходе мы должны получить координаты левого верхнего угла области, а также ширину и высоту Каждой области. Например,что-то вроде такого (свойство заменено цифрой).
Входные данные
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
Думал о том, что бы представить данную таблицу в виде графа, но как модифицировать его обход, даже не представляю. Возможно, у сообщества появятся какие-то идеи. Возможно, просто посоветуете, в сторону каких алгоритмов мне следует копать.
Добрый день!
Задача клевая, вот такие надо давать на контестах ;)
Что значит оптимально? Вы хотите решение за n^2 или здесь слово оптимально подразумевает в себе точное решение, а не приближенное?
Сейчас прикидывал выходные данные. Суммарное количество ячеек не превышает 10^5.
Под словом "оптимально" я понимал наименьшую временную сложность. Квадрат вполне подходит.
И рад, что задача вам понравилась)
Квадрат не то что подходит — лучшего решения не существует (но это не значит, что существует квадратичное).
На тимусе есть почти такая задача (http://acm.timus.ru/problem.aspx?space=1&num=1548, как решать не знаю.
Ага... задача схожа. Осталось найти кого-то, кто умеет такие решать. Спасибо.
По идее, это задача о покрытии множества (которая в общем случае NP-полная). В данном конкретном экземпляре несложно понять, что достаточно рассмотреть всего O(N2) различных прямоугольников (все оптимальные прямоугольники однозначно задаются левым и правым краями) и что ответ будет не больше N.
Моё чутьё говорит, что здесь либо сдаётся хороший перебор с доказанной асимптотикой (вида O(2N / 2 * poly(N))), либо задача сводится к чему-то решаемому за полиномиальное время.