これは単なるアイデアであり、機能するかどうかはわかりません。
A(i,j)(di,dj) を (i,j) から (i+di,j+dj) までのすべてが 1 のブロックとなるように定義します。つまり、i<=x に対して M[x,y]=1 を意味します。 <=i+di および j<=y<=j+dj。
A( i,j)(di+1,dj) と A(i,j)(di,dj+1) が存在しない場合、A(i,j)(di,dj) をmax-blockとして定義します。
各 (i,j) に対して、最大ブロックのリストを作成し、それを L(i,j) と呼びます。リストの最大長は min(m-i+1, n-j+1) <= min(m,n) です。
L(i,j) は、M[i,j]、L(i+1,j)、および L(i,j+1) のみに依存します。L(i+1,j) と L(i,j+1) から L(i,j) を構築することは線形時間で実行できると思います。ソートされたリストのマージについて思い出します。L(i,j) を使用して、L(i,j) の A(i,j)(di,dj) の max(di * dj) を見つけます。これらの値の最大値は、最大オールワン ブロックを指定します。
このアプローチには複雑さ n*m*min(m,n) ~= n^3 があり、必要な最後の 2 行を格納するために min(m,n)^2 スペースが必要です。