Магический замок

Построим двойственный граф, где вершины — треугольники, на которые разбит данный $$$n$$$-угольник, а ребро между двумя вершинами проведено в случае, если у соответствующих треугольников есть общее ребро. Несложно заметить, что получившийся граф является деревом.

Также несложно заметить, что удаление одной магической связи соответствует удалению одного ребра в дереве, а также удаляет из исходной триангуляции два треугольника. Поэтому новая формулировка задачи звучит так: удалить из построенного дерева минимальное количество ребер так, чтобы у каждой вершины было удалено хотя бы одно ребро. Это стандартная задача, которая решается динамическим программированием на дереве: $$$dp[v][flag]$$$ — минимальное количество ребер, которое надо удалить в поддереве вершины $$$v$$$, чтобы у каждой вершины было удалено хотя бы одно ребро, где $$$flag$$$ соответствует одному из двух значений — было ли уже удалено у вершины $$$v$$$ ребро или нет. Пересчет этой динамики довольно простой и остается в качестве упражнения.