Пишу инструмент для работы с плиточными изображениями. Одна из функций - преобразовать все изображение в набор фрагментов и карту фрагментов, например изображение размером 160x144px будет иметь набор уникальных фрагментов 8x8 и карту идентификаторов фрагментов 20x18.
Следующая цель - поддержка палитр. На некоторых старых платформах, которые использовали мозаичную графику, у вас могло быть 8 палитр по 4 цвета каждая или 16 палитр по 16 в каждой. Я хочу автоматически создать набор палитр, который соответствует пределу N на K, используя как можно меньше палитр; и назначьте эти палитры тайловой карте или предупредите, если это невозможно.
Есть несколько очевидных первых шагов: если в какой-либо отдельной плитке используется более K цветов, это будет невозможно; и как только это будет проверено, любая плитка, цвета которой являются подмножеством другого, может тривиально поделиться своей палитрой. Сложность заключается в обработке частично перекрывающихся палитр. Рассмотрим 17 плиток, каждая из которых имеет 15 уникальных цветов; при достаточном перекрытии они могут поместиться в цветовую палитру 16x16, но это может оказаться невозможным.
Я ожидаю, что здесь сработает решение для динамического программирования. На любом этапе проблемы есть частичное присвоение плиток палитрам; и решение состоит в том, какой из N палитр назначить следующую плитку. (Плитка может даже не иметь общих цветов с оптимальным выбором палитры в то время; рассмотрите 4 плитки, каждая с 4 уникальными цветами, все они могут использовать единую 16-цветовую палитру.)
Эта конкретная проблема уже решена? Есть ли для этого известный алгоритм или просто общие советы по динамическому программированию?