Предупреждение: доказано, что оно неоптимально
Как насчет жадного алгоритма, заставляющего людей говорить?Я не буду пытаться доказать, что это оптимально на данный момент, но это способ решения проблемы.
В этом решении мы используем G для обозначения количества смежных областей одного цвета впоследовательность кнопок.Скажем, у нас (я использую x для красного и o для синего, так как R и B выглядят слишком похожими):
x x x o x o o o x x o
Это даст G = 6. Давайте разделим это на группы (красный / синий)где, для начала, каждая группа получает целую область соответствующего цвета:
3/0 0/1 1/0 0/3 2/0 0/1 //total value: 0
Когда G <= k, у вас есть минимум ноль, поскольку каждая группировка может входить в свой собственный контейнер.Теперь предположим, что G> k.Наш жадный алгоритм будет состоять в том, что, хотя групп больше, чем контейнеров, две смежных группы объединяются в одну, что приводит к наименьшему значению контейнера delta (valueOf(merged(a, b)) - valueOf(a) - valueOf(b)
).Скажите k = 5 с нашим примером выше.Наш выбор:
Collapse 1,2: delta = (3 - 0 - 0) = 3
2,3: delta = 1
3,4: delta = 3
4,5: delta = 6
5,6: delta = 2
Итак, мы свернем 2 и 3:
3/0 1/1 0/3 2/0 0/1 //total value: 1
И k = 4:
Collapse 1,2: delta = (4 - 0 - 1) = 3
2,3: delta = (4 - 1 - 0) = 3
3,4: delta = (6 - 0 - 0) = 6
4,5: delta = 2
3/0 1/1 0/3 2/1 //total value: 3
k = 3
4/1 0/3 2/1 //total value: 6
k = 2
4/1 2/4 //total value: 12
k = 1
6/5 //total value: 30
Кажется оптимальным для этого случая , но я просто собирался привлечь людейговорить о решении.Обратите внимание, что начальные назначения кнопок для контейнеров были ярлыком: вместо этого вы могли бы начать с каждой кнопки в последовательности в своем собственном сегменте, а затем уменьшить ее, но вы всегда приходите к точке, в которой каждый контейнер имеет максимальное количество кнопок, равное одному.цвет.
Контрпример: Спасибо Жюлю Оллеону за предоставленный контрпример, о котором мне было лень думать:
o o o x x o x o o x x x
Если k = 2, оптимальное отображение будет
2/4 4/2 //total value: 16
Давайте посмотрим, как к нему подходит жадный алгоритм:
0/3 2/0 0/1 1/0 0/2 3/0 //total value: 0
0/3 2/0 1/1 0/2 3/0 //total value: 1
0/3 3/1 0/2 3/0 //total value: 3
0/3 3/1 3/2 //total value: 9
3/4 3/2 //total value: 18
Я оставлю этот ответ, так как он выполнил свою единственную цель:заставить людей говорить о решении.Интересно, можно ли использовать жадную эвристику в алгоритме информированного поиска, таком как A *, для улучшения времени выполнения исчерпывающего поиска, но это не приведет к полиномиальному времени выполнения.