Если я правильно понимаю ваш вопрос, не является ли эта проблема тем же, что и присвоение уникальных рангов каждому столбцу? Например, если в [p, q] есть 1, это означает, что q-му столбцу присвоен ранг p.
Таким образом, для матрицы NxN решение должно быть N! (факториал N)
Вы также можете использовать индукцию P (N) = n * P (N-1), поскольку, когда вы помещаете 1 где-нибудь в матрице NxN, строка и столбец блокируются им - так что у вас остается ( N-1) x (N-1) матрица.
РЕДАКТИРОВАТЬ: мое понимание проблемы было неправильно. Но вот новая попытка с подходом динамического программирования
Давайте сначала создадим DAG, например так:
узлы этого графа являются квадратами квадратов (p, q, size) - квадратами, закрепленными в row = p, col = q с элементами размера x размера. Да, они могут обернуться.
Для простоты вычислений пусть q всегда равно 0.
Для матрицы {{abc}, {def}, {ghi}} узлы будут
{a}, {d}, {g}: квадраты с размером 1: корневые узлы
{ab, de}, {de, gh}, {gh, ab}: квадраты размером 2
{{abc}, {def}, {ghi}}: только квадрат размера N, то есть сама матрица: листовой узел
Направленные края указывают от квадратов размером n до n + 1 И, если маленький квадрат может содержаться в большем.
Например, {d} указывает на {ab, de} и {de, gh}
Важное замечание: между размером n и размером n + 2 не должно быть никаких граней
Traversal
Основание: присвоить веса квадратам размера 1: Квадрат (p, 0,1) = 1 тогда и только тогда, когда M (p, 0) == 1
Шаг: Для квадратов размера N, посетите детей, то есть квадратов размера N + 1. Внесите свой вес ребенку, если угол, к которому он растет, равен 1, иначе - нет.
Листовой узел будет иметь ваш ответ.
Это решение, по сути, является подходом обхода снизу вверх и позволит избежать дублирования вычислений подзадач.