Добрый вечер !
Самым простым способом решить поставленную задачу будет: метод перебора; а именно:
Предположим у нас есть матрица 10 на 12 элементов, следующего вида:
Видно, что максимальную площадь имеет прямоугольник выделенный зеленым цветом. (4*6=24).
Алгоритм может быть следующим:
1). Определение принадлежности:
Берется первый элемент матрицы (1,1); (х, у)
Если он равен единице, то он считается потенциально возможным элементом прямоугольника, если нет, то переходим к следующему элементу (2,1);
В нашем случае элемент (1,1) равен единице, а значит можно начать сканирование.
2). Сканирование размеров потенциального прямоугольника:
Рассматриваем строку, в которой стоит элемент, берем элемент (1,2);
Если он равен единице, то рассматриваем следующий элемент в строке до тех пор, пока не натыкаемся на 0. В результате получаем максимально возможную ширину прямоугольника. В нашем случае она равна пяти.
Далее спускаемся на строчку ниже (2,1);
Сканируем ее аналогичным образом.
Если первый же элемент новой строки (2,1) равен нулю, то операции с первым элементом матрицы прекращаются и мы переходим ко второму… В этом случае площадь прямоугольника, принадлежащего первому элементу матрицы будет равна 5*1=5.
Запоминаем ее в стек (так же можно занести его координаты, если это необходимо по заданию) .
В случае, если первый элемент новой строки не равен нулю, то мы так же сканируем ее по длине до встречи первого нуля.
Если в этой строке 0 встречается раньше, чем в предыдущей, то максимальная длина прямоугольника автоматически уменьшается до этого значения. (В нашем случае они равны) .
Сканируется третья строка (3,1), в первом элементе которой стоит 0. Алгоритм закончен.
Найденный прямоугольник имеет площадь 5*2=10.
3). Переход к следующему элементу:
Сдвигаемся по координате Х на единицу (1,2). И выполняем аналогичные действия по пунктам 1,2. В результате чего находим самый большой прямоугольник (но пока об этом не знаем) 4*6=24.
Переходим к следующему элементу, находим 3*6=18, к следующему: 2*7=14…
После прохода всей матрицы нам лишь стоит упорядочить по возрастанию весь стек и выбрать наибольший элемент и его координаты (координаты можно задавать двумя точками начала и конца диагонали прямоугольника) .
Все. Прямой алгоритм написан.
Дана матрица M*N, состоящая из "0" и "1".
Найти в ней наибольший по площади прямоугольник, состоящий только из единиц.
Алгоритм должен работать быстро.