Это помогает упростить задачу, чтобы зависеть только от отдельных значений (а не пар соседних значений).Так что XOR сетка с каждой идеальной шахматной доской :
01111111 10000000
10111111 01000000
11111111 00000000
11111111 00000000
11111111 00000000
11111111 00000000
11111111 00000000
11111111 00000000
, где теперь цель найти самый большой квадрат в сетке либо , котораяимеет не более K_i 0s (очевидно, в пользу левого здесь).
Начните с K_i = 0.Чтобы найти наибольший квадрат из 1 с, вычислите для каждой ячейки число 1 в строке и столбце , начиная с него (0 для ячейки, содержащейа 0);самый большой квадрат с этой ячейкой в качестве ее верхнего левого угла (при условии, что это 1) будет тогда на единицу больше, чем минимум длины строки его правого соседа, длины столбцаего нижний сосед и квадратный размер его нижнего правого соседа.(Все это 0 для несуществующих ячеек вне сетки.) Посетите ячейки в diagonal-major , чтобы получить эти значения, когда они вам нужны;обратите внимание на наибольший размер квадрата.
Чтобы обобщить до K_i > 0, сохраните для каждой ячейки эти три значения (длину строки, длину столбца и размер квадрата) для каждого числасальто до K_i .Ячейка с 1 добавляет 1 к каждой длине строки / столбца, как и раньше, в то время как ячейка с 0 сдвигает этих длин до следующего числа бросков, отбрасывает тех, чье количество бросков теперьслишком большое и добавление новое значение 0 для 0 сальто.Для каждой комбинации длины строки на восток, длины столбца на юг и размера квадрата на юго-восток, каждая из которых имеет счетчик отражений, ячейка получает кандидата квадратного размера, который является их минимумом с сумма их числа бросков, плюс один , если ячейка сама по себе равна 0.Для каждого числа бросков (которое не слишком велико) сохраняйте наибольший размер квадрата, отмечая, является ли он наибольшим за все время (для этого числа бросков).
Обратите внимание, что решение методом грубой силы может бытьпочти так же быстро, когда квадраты намного меньше, чем массив, так как каждый из них нужно посещать только небольшое количество раз.