O (n ^ 2) возможно.Я думаю, это оптимально, так как у вас есть n ^ 2 ячеек.
Обратите внимание, что верхний левый угол и нижний правый угол любого квадрата лежат вдоль одной диагонали.
Теперь, еслимы могли бы обработать каждую диагональ за O (n) время, у нас был бы O (n ^ 2) алгоритм времени.
Скажем, у нас есть кандидат на верхний левый угол.Мы можем вычислить количество непрерывных черных ячеек под ним, а справа от него взять минимум двух и назвать его T.
Для нижнего правого кандидата мы можем вычислить количество непрерывных черных ячеек.черные клетки слева от него, а сверху и взять минимум из двух, назовите его B.
Как только у нас есть два числа T и B, мы можем сказать, если данный верхний левый,кандидат в правом нижнем углу фактически дает нам квадрат со всеми черными границами.
Теперь эти два числа можно вычислить для каждой ячейки за O (n ^ 2) времени, сделав четыре прохода через всю матрицу (Как?).
Итак, давайте предположим, что это сделано.
Теперь рассмотрим диагональ.Наша цель - найти верхнюю левую, нижнюю правую пару вдоль этой диагонали за O (n) времени.
Предположим, что мы вычислили T в массиве T [1 ... m], где m - длина диагонали.Точно так же у нас есть массив B [1 ... m].T [1] соответствует верхнему левому концу диагонали, а T [m] нижнему правому.Аналогично с B.
Теперь мы обрабатываем диагональ следующим образом: для каждого верхнего левого кандидата i мы пытаемся найти правого нижнего кандидата j, который даст наибольший квадрат.Обратите внимание, что j> = i.Также обратите внимание, что если (i, j) является кандидатом, то (i ', j) нет, где i'> i.
Обратите внимание, что i и j образуют квадрат, если T[i] >= j-i+1
и B[j] >= j-i+1
.
т.е. T[i] +i - 1 >= j
и B[j] -j - 1 >= -i
.
Таким образом, мы формируем новые массивы, такие что TL[k] = T[k] + k -1
и BR[k] = B[k] -k - 1
.
Итак, учитывая два новыхДля массивов TL и BR и a i нам нужно ответить на следующие запросы:
Какой самый большой j такой, что TL [i]> = j и BR [j]> = -i?
Теперь предположим, что мы смогли обработать BR для запросов с максимальным диапазоном (это можно сделать за время O (м)).
Теперь, учитывая TL [i], в диапазоне [i, TL [i]] мы находим максимальное значение BR, скажем, BR [j1].
Теперь, если BR [j1]> = -i, мы найдем максимум BR в диапазоне [j1,TL [i]] и продолжайте в том же духе.
Как только мы найдем кандидата (TL [i], BR [j]), мы можем игнорировать массив BR [1 ... j] для будущего i.
Это позволяет нам обрабатывать каждую диагональ за O (n) время, давая общий алгоритм O (n ^ 2).
Я упустил много деталей и дал набросокч, как это было уже слишком долго.Не стесняйтесь редактировать это с разъяснениями.
Фу.