Задать вопрос
@m1greatcool

Как решить задачу об огурцах?

Задача об огурцах.
Задано поле n x m квадратных ячеек, в каждой из которых могут находиться посадки огурцов.
Необходимо построить парники, закрывающие огурцы. Парники могут быть только прямоугольной формы, только со сторонами, параллельными сторонам поля. Стоимость строительства одного парника складывается из двух составляющих - известной постоянной и величины, пропорциональной площади парника. Парник может накрывать только целое количество ячеек. Выяснить какие варианты строительства парников наименее затратны при условии, что закрытыми от непогоды оказываются все ячейки с огурцами.
// В общем подскажите в какую сторону двигаться.
Что я надумал?
У нас есть коэффициент плотности огурцов это кол-во огурцов делить на всего клеток. И вот мы выбираем такие места для парников, что оказываются максимальными по размеру И коэффициент плотности в них БОЛЬШЕ или РАВЕН общему коэффициенту - это будет оптимально, НО при проходе с начала и с конца у нас получаются РАЗНЫЕ результаты и непонятно откуда начинать перебор, и в общем сложно. Кто может помогите...
  • Вопрос задан
  • 536 просмотров
Подписаться 2 Оценить 10 комментариев
Пригласить эксперта
Ответы на вопрос 3
Mrrl
@Mrrl
Заводчик кардиганов
Если один из размеров не очень большой, например, не больше 15, сработает динамическое программирование.
Идём по полю с узкой стороны, двигая линию каждый раз на одну клетку. Для конкретной конфигурации парников у нас в каждый момент линия делится на отрезки, каждый из которых может либо принадлежать своему парнику, либо быть пустым (не покрытым парниками). При этом отрезки с парниками могут касаться друг друга, а пустые отрезки - нет, они сливаются в один. Кроме того, мы помним накопленный штраф для созданных (в том числе, закрытых) парников и их площади.
На каждом шагу мы можем:
- сначала закрыть некоторые парники (соответствующие отрезки станут пустыми)
- продлить остальные парники ещё на клетку (к штрафу добавляется число клеток этих парников)
- на пустых местах открыть новые парники (к штрафу добавляется стоимость открытия этих парников и число клеток в них).
При этом все клетки с огурцами должны оказаться закрытыми. Открывать новые парники, в которых пока нет ни одного огурца, смысла нет. Все остальные варианты должны быть рассмотрены.
Начинаем с одного пустого отрезка. На каждом шагу обрабатываем все имеющиеся конфигурации, строим их продолжения. Из эквивалентных новых конфигураций (в которых одинаковые карты отрезков) выбираем ту, у которой меньше штраф.
Всё. Осталось придумать, как дёшево хранить пройденные пути, чтобы потом восстановить результат.
Ответ написан
@MiiNiPaa
Назовём нормализированым парник, в котором нет "пустых" границ, т.е. на верхней, нижней, правой и левой границах есть, как минимум, по одному огурцу.

Начнём с одной теплицы, охватывающей всё поле. Нормализируем её, считаем стоимость.

Рассматриваем все варианты разбиения одной прямой (проходимся по всем внутренним вертикалям, затем горизонталям). Для каждого разбиения нормализируем получившиеся теплицы, подсчитываем стоимость. Затем берём разбиение с наименьшей стоимостью. Если эта стоимость больше или равна оригинальной, оставляем оригинальную теплицу, КОНЕЦ. Иначе используем две новых теплицы и для каждой из них рекурсивно запускаем этот алгоритм.

EDIT: Не работает для всех видов полей. Контрпример в комментариях.
Ответ написан
AtomKrieg
@AtomKrieg
Давай я поищу в Google за тебя
Стоимость парника #1 равна p1 = x*S1 + c
Стоимость всех парников ( с номерами от 1 до n) p = x*S1+c+ ... + x*Sn+c
Выносим константу за скобки p = x*(S1 + ... Sn) + c*n
По условию задачи сумма площадей всех парников равна площади поля. Поэтому стоимость строительства зависит от количества парников n. Чем меньше парников тем дешевле.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы