Найти максимальный прямоугольник 1 с


21

Задний план

Я хочу купить участок земли и построить на нем свой дом. Мой дом должен быть прямоугольным и максимально большим; Тем не менее, на доступных участках есть много каменистых участков, на которых я не могу построить, и у меня возникают проблемы с установкой потенциального дома на участках. Я хочу, чтобы вы написали программу, которая анализирует графики для меня.

Вход и выход

Ваш ввод представляет собой прямоугольный двумерный массив битов размером не менее 1 × 1 в любом приемлемом формате. Массив представляет собой участок земли; 1Это «хорошие» районы, где я мог бы построить свой дом, и 0это «скалистые» районы, где дом не может быть построен.

Ваш вывод должен быть максимальной площадью сплошного прямоугольника 1s во входном массиве. Он представляет собой площадь самого большого дома, который я мог построить на участке. Обратите внимание, что если 1на входе нет s, то вывод будет 0.

пример

Рассмотрим вход

101
011
111

Самый большой прямоугольник 1s - это прямоугольник 2 × 2 в правом нижнем углу. Это означает, что правильный вывод 4.

Правила и оценки

Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.

Контрольные примеры

0
-> 0

1
-> 1

00
00
-> 0

01
10
-> 1

01
11
-> 2

111
010
111
-> 3

101
011
111
-> 4

0111
1110
1100
-> 4

1111111
1110111
1011101
-> 7

111011000
110111100
001111110
011111111
001111110
000111100
000011000
-> 20

000110000
110110010
110111110
110011100
010011111
111111111
111101110
-> 12

8
Бульдозер, 4 байта: plow.
Конор О'Брайен

1
Это нормально, если мое решение работает только для прямоугольников размером до 30 × 30?
Нил

1
@Neil Нет, он должен (по крайней мере, теоретически) работать примерно с такими большими входными данными, которые может выдержать ваш язык.
Згарб

1
Я надеялся сделать немного подлый, но в этом случае я не буду беспокоиться.
Нил

1
Нужно ли учитывать учет ротации?

Ответы:


13

Желе , 21 20 18 17 байт

ṡṂ€€×"
‘×¥\ç"Ụ€FṀ

Попробуйте онлайн! или проверьте все контрольные примеры .

Задний план

Пусть м будет матрицей битов, такой как

0 0 0 1 1 0 0 0 0
1 1 0 1 1 0 0 1 0
1 1 0 1 1 1 1 1 0
1 1 0 0 1 1 1 0 0
0 1 0 0 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1 0

Начнем с подсчета количества 1 бит в каждом столбце M , сбрасывая счет каждый раз, когда встречаем 0 бит.

Для нашего примера матрицы это дает

0 0 0 1 1 0 0 0 0
1 1 0 2 2 0 0 1 0
2 2 0 3 3 1 1 2 0
3 3 0 0 4 2 2 0 0
0 4 0 0 5 3 3 1 1
1 5 1 1 6 4 4 2 2
2 6 2 2 0 5 5 3 0

Далее мы вычисляем все смежные подсписки каждой строки. Мы достигаем этого путем генерации всех срезов длиной k , где k варьируется от 1 до количества записей в каждой строке.

Для предпоследнего ряда это дает

[1], [5], [1], [1], [6], [4], [4], [2], [2]
[1, 5], [5, 1], [1, 1], [1, 6], [6, 4], [4, 4], [4, 2], [2, 2]
[1, 5, 1], [5, 1, 1], [1, 1, 6], [1, 6, 4], [6, 4, 4], [4, 4, 2], [4, 2, 2]
[1, 5, 1, 1], [5, 1, 1, 6], [1, 1, 6, 4], [1, 6, 4, 4], [6, 4, 4, 2], [4, 4, 2, 2]
[1, 5, 1, 1, 6], [5, 1, 1, 6, 4], [1, 1, 6, 4, 4], [1, 6, 4, 4, 2], [6, 4, 4, 2, 2]
[1, 5, 1, 1, 6, 4], [5, 1, 1, 6, 4, 4], [1, 1, 6, 4, 4, 2], [1, 6, 4, 4, 2, 2]
[1, 5, 1, 1, 6, 4, 4], [5, 1, 1, 6, 4, 4, 2], [1, 1, 6, 4, 4, 2, 2]
[1, 5, 1, 1, 6, 4, 4, 2], [5, 1, 1, 6, 4, 4, 2, 2]
[1, 5, 1, 1, 6, 4, 4, 2, 2]

Далее мы сопоставляем каждый срез с произведением его минимума и его длины. Для каждого среза это вычисляет площадь прямоугольника 1 бита максимальной высоты, в которой данный срез является нижней строкой.

Для срезов длины 3 предпоследней строки нашей примерной матрицы это дает

3 3 3 3 12 6 6

Все, что осталось сделать, это взять максимум на всех срезах всех строк.

Для нашего примера матрицы это дает 12 .

Как это устроено

‘×¥\ç"Ụ€FṀ  Main link. Argument: M (2D list of bits)

   \        Reduce the columns of M by the link to the left.
  ¥           Combine the two atoms to the left into a dyadic chain.
‘               Increment the left argument.
 ×              Multiply the result with the right argument.
      Ụ€    Grade up each; yield the indices of each row of M, sorted by their
            values. The order is not important here; we just need the indices.
    ç"      Apply the helper link to each element of the result to the left and
            the corresponding element of the result to the right.
        F   Flatten the resulting, nested list.
         Ṁ  Extract the maximum.


ṡṂ€€×"      Helper link. Arguments: R (row), X (indices of R)

ṡ           For each k in X, split R into overlapping slices of length k.
 Ṁ€€        Compute the minimum of each individual slice.
    ×"      Multiply the minima of all slices of length k by k.

7
Я не знал тебя, где этот богатый, Деннис. € $ € €odge
orlp

5
Это все о деньгах. Обмен $ на ¥ сэкономил 2 байта.
Деннис

1
Как на нашей родной земле вы всегда придумываете такие умные подходы?
Дрянная Монахиня

Потому что Деннис не просто переигрывает!
Грифон - Восстановить Монику

6

MATL, 32 31 27 байт

n:"@:"@1M2$ltntG4$bZ+=a*vX>

При этом используется метод грубой силы на основе двухмерной свертки. Все возможные размеры прямоугольника созданы и свернуты с ландшафтом. Максимальным результатом всех сверток является максимальная площадь прямоугольника.

Это крайне неэффективное решение, потому что для сохранения байтов я создаю ядра для всех прямоугольников между [1, 1]и[numel(input) numel(input)] , а не на самом деле определения количества строк / столбцов во входных данных , чтобы определить соответствующие диапазоны размеров прямоугольника.

Спасибо @Luis за предложение использовать Mи опустить ]].

Попробуйте онлайн!

объяснение

        % Implicitly grab input as a 2D numeric array
n       % Compute the number of elements in the input (over estimation of max kernel size)
:       % Create array 1:n
"       % For each value
  @     % Current loop index
  :     % Create an array from 1:(current_index)
  "     % For each of these values   
    @   % Push the current index onto the stack
    1M  % Grab the input to the previous function call (the outer index)
    2$l % Create an array of 1's whose dimensions are specified by top two stack elements
    tn  % Duplicate this array and compute number of elements
    t   % Duplicate this number
    G   % Explicitly grab input
    4$b % Bubble up the 4th element from the stack (the kernel)
    Z+  % Perform 2D convolution of this kernel and the input
    =a  % Determine if any convolution result (in each column) is equal to the area of the kernel.
        % This yields a row vector
    *   % Multiply the logical result by the area
    v   % Vertically concatenate all results (forces the row vectors above to be column vectors)
    X>  % Compute the maximum yielding the largest area
        % Implicitly display the result.

5

Юлия, 83 60 57 53 байта

!M=M1?sum(M):maximum(t->!rotr90(M,t)[2:end,:],0:3)

Попробуйте онлайн! Последний контрольный пример превышает ограничение времени TIO, но я проверил его локально.

Как это устроено

Во- первых, ! проверяет, состоит ли его матричный аргумент M полностью из 1 .

  • Если так, то ! возвращает сумму записей M , которая равна его площади.

  • Если нет, то ! делает следующее:

    1. Поверните M на 0 ° , 90 ° , 180 ° и 270 ° по часовой стрелке.

    2. Удалить первую строку каждый из четырех вращений, эффективно удаляя один из верхнего ряда, нижнего ряда, крайнего левого столбца и правой колонки М .

    3. Вызовите себя рекурсивно для каждой из подматриц.

    4. Вернуть максимум возвращаемых значений из рекурсивных вызовов.


4

JavaScript (ES6), 97 байт

a=>a.map((b,i)=>a.slice(i).map((c,j)=>c.map((d,k)=>(n=(b[k]&=d)&&n+j+1)>r?r=n:0,n=0),c=[]),r=0)|r

Оказывается, немного вертеться все еще выигрывает. Принимает массив массив целых чисел. Ungolfed:

function rect(array) {
    var max = 0;
    for (var i = 0; i < array.length; i++) {
        var bits = array[i];
        for (var j = 0; i + j < array.length;) {
            var row = array[i + j];
            j++;
            var size = 0;
            for (var k = 0; k < row.length; k++) {
                if (!row[k]) bits[k] = 0;
                size = ones[k] ? size + j : 0;
                if (size > max) max = size;
            }
        }
    }
    return max;
}

Массив разделен по строкам в соответствии с другими ответами, поэтому каждый возможный диапазон строк циклически повторяется. Учитывая диапазон строк, следующий шаг должен измерить доступные прямоугольники. Это достигается путем объединения строк по битам; Результатом является список битов, которые были установлены во всем диапазоне строк. Затем остается найти максимальную длину установленных битов в строке и умножить ее на высоту диапазона. Тест бесстыдно украден у @ ed65:

f=
a=>a.map((b,i)=>a.slice(i).map((c,j)=>c.map((d,k)=>(n=(b[k]&=d)&&n+j+1)>r?r=n:0,n=0),c=[]),r=0)|r

// test cases as strings, converted to 2d arrays
result.textContent = [
  ['0', 0],
  ['1', 1], 
  ['00 00', 0],
  ['01 10', 1],
  ['01 11', 2],
  ['111 010 111', 3],
  ['101 011 111', 4],
  ['0111 1110 1100', 4],
  ['1111111 1110111 1011101', 7],
  ['111011000 110111100 001111110 011111111 001111110 000111100 000011000', 20],
  ['000110000 110110010 110111110 110011100 010011111 111111111 111101110', 12]
].map(t => t[0].replace(/ /g, '\n') + '\n' + t[1] + '\n' + f(t[0].split` `.map(r => [...r]))).join`\n\n`
<pre id=result></pre>


1
Я бы сказал, что, поскольку ваша репутация составляет 10000000000000 в двоичном формате, я думаю, что оставлю это на некоторое время.
Уровень Река St

я по очереди возиться: D, мне пришла в голову похожая идея, но я всегда приходил слишком поздно: p
Abr001am

4

Python 2.7, 93 91 89 81 79 байт

f=lambda M,t=1:max(f(M[1:]),f(zip(*M)[::-1],t+1))if`t/3`in`M`else`M`.count(`t`)

Вход представляет собой список кортежей. Проверьте меньшие контрольные примеры здесь и большие контрольные примеры здесь .

Без напоминания последние два тестовых случая превышают лимит времени Ideone, так как они требуют, соответственно, 1 530 831 935 и 2 848 806 121 звонков на f , что на моей машине занимает 39 и 72 минуты.

Алгоритм

Для данной матрицы M общая идея состоит в том, чтобы выполнить итерацию по всем подматрицам M , удаляя верхние строки и поворачивая четверть оборота против часовой стрелки, отслеживая размеры встречающихся подматриц, которые полностью состоят из 1 бита.

Использование простой рекурсивной реализации приведенной выше идеи приводит к функции f (M), которая выполняет следующее.

  1. Если M не содержит 0 битов, вернуть его количество 1 бит.

  2. Если мы уже повернули M два раза, и он не содержит 1 бит, верните 0 .

  3. Если мы уже повернули M пять раз, вернем 0 .

  4. Рекурсивно вызвать F на M без его верхнего ряда.

  5. Рекурсивно вызвать F на M повернут на четверть оборота против часовой стрелки.

  6. Вернуть максимум возвращаемых значений из рекурсивных вызовов.

Код

В реализации мы используем дополнительный аргумент функции t, который по умолчанию равен 1, чтобы отслеживать, сколько раз мы уже поворачивали эту конкретную матрицу. Это позволяет объединить шаги с 1 по 3 в один шаг путем тестирования ​`t/3`in`M`​и возврата в ​`M`.count(`t`)​случае сбоя теста.

  1. Если t = 1 , мы не вращали эту конкретную подматрицу ранее в этой ветви.

    t / 3 = 0 , поэтому ​`t/3`in`M`​вернет True, если строковое представление M содержит символ 0 .

    Если этого не произойдет , мы возвращаемся ​`M`.count(`t`)​, число раз , символ 1 появляется в строке представления М .

    Обратите внимание, что матрица без 0 битов может появиться, только если t = 1 , так как в этом случае мы не рекурсивно.

  2. Если 3 ≤ t ≤ 5 , мы ранее вращали эту конкретную подматрицу как минимум два раза в этой ветви.

    t / 3 = 1 , поэтому ​`t/3`in`M`​вернет True, если строковое представление M содержит символ 1 .

    Если этого не произойдет , мы возвращаем 0 , вычисленный , как ​`M`.count(`t`)​, сколько раз строковое представление т (т.е. символ 3 , 4 или 5 ) появляется в строке представления М .

  3. Если т = 6 , мы ранее вращали эту конкретную подматрицу пять раз в этой ветви.

    t / 3 = 2 , поэтому ​`t/3`in`M`​вернет False , потому что строковое представление M не содержит символа 2 .

    Возвращается 0 вычисляется ​`M`.count(`t`)​, число раз символьные 6 появляется в строковом представлении М .

Если f еще не вернулся, остальные шаги выполняются.

  1. f(M[1:])вызывает f на M без его верхнего ряда. Поскольку t не указан, по умолчанию он равен 1 , что означает, что это первый раз f встречает эту конкретную подматрицу в этой ветви.

  2. f(zip(*M)[::-1],t+1)звонит ф на М повернуты на четверть оборота против часовой стрелки, увеличивая t чтобы отследить время, когда мы повернули эту конкретную подматрицу в этой ветви.

    Четверть оборота получается путем объединения строк M друг с другом, возвращая кортежи соответствующих элементов строк M , таким образом транспонируя М , затем изменяет порядок строк (то есть, помещая верхнюю строку в нижней части, и наоборот ).

  3. Наконец, maxвозвращает максимум возвращаемых значений из рекурсивных вызовов.


хм все эти представления являются выдающимися идеями? довольно увлекательно, что делает функция zip?
Abr001am

zipвозвращает список кортежей соответствующих элементов своих аргументов. С распакованным 2D списком (матрицей) *Mон по существу транспонирует строки и столбцы, поэтому zip(*M[::-1])выполняет поворот на 90 ° по часовой стрелке.
Деннис

спасибо, Python это очарование, я узнаю это когда-нибудь.
Abr001am

2

JavaScript (ES6), 154 176

Редактировать попытался немного сократить, но не может конкурировать с решением @ Neil

Попробуйте все возможные прямоугольники, верните максимальный размер. Вероятно, тот же алгоритм ответа Matl, только в 6 раз дольше.
Ввод как двумерный массив целых

g=>g.map((r,i)=>r.map((x,j)=>v=s(r,j,(_,l)=>s(g,i,(_,k)=>!s(g,k,r=>s(r,l,x=>!x,l+j+1),k+i+1)))&(t=-~i*-~j)>v?t:v),s=(a,i,l,j)=>a.slice(i,j).some(l),v=0)|v

Меньше гольфа

Это оригинальный алгоритм, в версии для гольфа используется много функций обхода массива вместо циклов

g=>{
  v = 0
  for(i = h = g.length; i; i--)
    for(j = w = g[0].length; j; j--)
    {
      p = true
      for(k=0; p && k <= h-i; k++)
        for(l=0; p && l <= w-j; j++)
          p = g.slice(k, k+i).some(r=>r.slice(l, l+j).some(x=>!x));
      if (!p && i*j<v)
        v = i*j
    }
  return v
}

Тестовое задание

f=g=>g.map((r,i)=>r.map((x,j)=>v=s(r,j,(_,l)=>s(g,i,(_,k)=>!s(g,k,r=>s(r,l,x=>!x,l+j+1),k+i+1)))&(t=-~i*-~j)>v?t:v),s=(a,i,l,j)=>a.slice(i,j).some(l),v=0)|v

console.log=(...x)=>O.textContent+=x+'\n'

// test cases as strings, converted to 2d arrays
;[
  ['0',0],['1',1],['00 00',0],['01 10',1],['01 11',2],
  ['111 010 111',3],['101 011 111',4],
  ['0111 1110 1100',4],['1111111 1110111 1011101',7],
  ['111011000 110111100 001111110 011111111 001111110 000111100 000011000',20],
  ['000110000 110110010 110111110 110011100 010011111 111111111 111101110',12]
].forEach(t=>{
  var k=t[1]
  var p=t[0].split` `.map(r=>[...r].map(x=>+x))
  var r=f(p)
  console.log((r==k?'OK':'KO')+' '+r+(r==k?'':' expected '+k)+'\n'+p.join`\n`+'\n')
  })
<pre id=O></pre>


2

APL (Dyalog Extended) , 27 23 20 байт

-3 байта от Adám и ngn

{⌈/∊(×/×⍵⍷⍨⍴∘1)¨⍳⍴⍵}

Попробуйте онлайн!

{⌈/∊(×/×⍵⍷⍨⍴∘1)¨⍳⍴⍵}    Monadic function taking an argument ⍵:
                 ⍳⍴⍵     Indices: e.g. for a 3x7 array
                                       (1 1) (1 2) ...  (1 7)
                                       (2 1) (2 2)  ... (2 7)
                                       (3 1) (3 2)  ... (3 7)
    (×/×⍵⍷⍨⍴∘1)         Helper fn: Takes  and x (e.g. (2 2))
            ⍴∘1             Make an array of 1s of shape x. Call it a.
        ⍵⍷⍨                 All places where a exists in x
     ×/                      Product of x's dims (size of a)
       ×                 Size of a where a is in ⍵, and 0 elsewhere.
    (×/×⍵⍷⍨⍴∘1)¨        Call the helper function on x and each (¨) index.
                            We now have a nested list containing sizes of blocks in ⍵
                            and many 0s.
   ∊                        Flatten
 ⌈/                        Find the maximum value.

{⌈/,(×/×1∊⍵⍷⍨⍴∘1)¨⍳⍴⍵}короче и проще (даже не требует расширенного).
Адам

1
@lirtosiast @ Adám{⌈/∊(×/×⍵⍷⍨⍴∘1)¨⍳⍴⍵}
ngn

2

Брахилог , 20 17 15 байт

Спасибо Kroppeb за 2 байта

{s\sc≡ᵛ¹l}ᶠ⌉|hh

Попробуйте онлайн!

объяснение

{        }ᶠ      Find all possible outputs of the following predicate:
 s                Find a sublist of the array (i.e. remove 0 or more rows from the top
                  and/or bottom)
  \               Transpose the array
   s              Find a sublist again
                  The result is some sub-rectangle of the array
    c             Concatenate all the rows in that rectangle into one list
     ≡ᵛ¹          Verify that all the elements are 1
        l         Get the length (i.e. how many 1's make up the rectangle)
                 Now we have a list of the sizes of all possible 1-rectangles
           ⌉     Take the maximum

            |    If no 1-rectangles could be found:
             hh   Take the head of the head of the array (i.e. the top left element)
                 Since the array contains no 1's in this case, this will give 0

aaможно заменить s Попробуй онлайн!
Кроппеб

1

R , 129 122 байт

function(M,D=dim(M),L=`for`){L(i,1:D,L(j,1:D[2],L(r,0:(D-i),L(c,0:(D[2]-j),F<-max(F,i*j*(i*j==sum(M[r+1:i,c+1:j])))))))
F}

Попробуйте онлайн!

Простой и простой подход грубой силы.

Развернутый код и объяснение:

function(M){                       # M is the matrix of 0/1
n = 0                              # n is the biggest rectangle found
R=nrow(M)
C=ncol(M)
for(i in 1:R)                      # for each possible num of rows of the rectangle
  for(j in 1:C)                    # for each possible num of cols of the rectangle
    for(r in 0:(R-i))              # for each possible position offset on the rows
      for(c in 0:(C-j){            # for each possible position offset on the cols

         subM = M[1:i+r,1:j+c]     # sub-set the matrix given the size of rectangle and offsets

         if(sum(subM)==i*j)        # if sub-matrix is full of 1's
            rec = i*j              # (i.e. nrow*ncol == sum of values in sub-matrix)
         else                      # store the rectangle area
            rec = 0                # otherwise store 0

         n = max(n,rec)            # keep the maximum rectangle found
      }
}


0

Matlab 106 байт

x=input('');[n,k]=size(x);r=0;for p=1:n;for m=1:k;r=max([p*m*(any(conv2(x,ones(p,m))==p*m)),r]);end;end;r

Ungolfed:

x=input(''); %//Take input
[n,k]=size(x); %//Determine array size
r=0; %//Variable for output. Initially zero
for p=1:n; %// Loop through the columns
    for m=1:k; %// Loop through the rows
        r=max([p*m*(any(conv2(x,ones(p,m))==p*m)),r]);%//See explanation below
    end;
end;
r %//Display result

Операция в цикле начинается с двухмерной свертки conv2()входного массива с p*mмассивом единиц. ==p*mпроверяет, содержит ли результирующий массив элемент, равный p*m. Соответствующий элемент превращается в 1, все остальные элементы превращаются в 0. any()превращает массив в вектор. В 1противном случае столбцы, содержащие хотя бы одну ненулевую запись, преобразуются в 0. p*m*()умножает вектор, p*mпревращая все 1-s в p*m. [__,r]квадратные скобки объединяют полученный результат с предыдущей максимальной площадью, сохраненной в r. Наконец, max()находит максимальное значение в результирующем векторе.


что делает функция?
Abr001am

@ Agawa001 для каждого столбца в двумерном массиве any()возвращает, 1если столбец содержит ненулевой элемент и в 0противном случае.
Brainkz

0

Matlab (222)(209)

На самом деле, это решение приносит мне стыд за то, что я вдвое больше, чем само решение на одном языке, но ... глупо, я думал об этом в течение 6 часов! и хитрость немного отличается от ответов Денниса и Нейла.

    function p=g(x,a,u,i,j),i=i+~u;j=j+u;p=0;if(j*u+i*~u>=size(a,2-u))return;end,x=circshift(x,[0-u -1+u]),a=(x+a).*~~x.*~~a;for h=0+u:1,p=max([p,reshape(a(1:end-j,1:end-i),1,[]),g(~u*(a*h+x*~h)+u*x,a,h,i,j)]);end
  • Функция называется как

    y=[1 1 1 0 1 1 0 0 0;
    1 1 0 1 1 1 1 0 0;
    0 0 1 1 1 1 1 1 0;
    0 1 1 1 1 1 1 1 1;
    0 0 1 1 1 1 1 1 0;];
    t=g(y,y,[],0,0,0);t,
    
  • Я мог бы сэкономить больше байтов, если бы вводил длину матрицы в размерах функции, хотя бы и больше игры в гольф продолжается.

  • Как это происходит?

    Этот алгоритм добавляет фактическую матрицу к себе, сдвинутую влево, с небольшим поворотом (&). на любом этапе полученная матрица устанавливается как исходная и добавляется к себе, многократно смещаясь вверх, а затем перезапускается с начала с новой матрицей. Все подэлементы всех матриц, сгенерированных этой операцией (original_matrix+shifted_matrix)&shifted_and_original_matrices), максимизируются до выхода.

пример:

     1 1 1         1 1 0                      2 2 0                  0 2 0                        0 4 0
 M0= 0 1 1  M0<<1= 1 1 0  M1=(M0+M0<<1)&both= 0 2 0    shift(M1,up)= 2 0 0  M2=(M1+sh(M1,u)&both= 0 0 0  
     1 1 0         1 0 0                      2 0 0                  0 0 0                        0 0 0
                        2 0 0                               4 0 0
 M3=(M0<<1+M0<<2)&both= 2 0 0 , M4=(M3+shift(M3,up))&both=  0 0 0
                        0 0 0                               0 0 0

                3 0 0                             
 M5=(M1+M0<<2)= 0 0 0 , M6=(M5+shift(M5,up))&both=zeros(3,3).
                0 0 0

 Max_of_all_values=Max(0,1,2,3,4)=4

0

Japt , 30 байт

®åÏ*°X}ÃÕ®£ZãYÄÃm®rm *Zl}Ãc rw

Попробуйте все тестовые случаи

Примерно порт Денниса ответит желе. Тестовые случаи - это просто двумерные массивы чисел, преобразованные из формата вопроса с помощью этого .

Объяснение:

®      Ã                          #For each row:
 å    }                           # Replace each number with this running total:
    °X                            #  Increment the previous total
  Ï*                              #  Multiply it by the current number
        Õ                         #Transpose rows and columns
         ®               Ã        #For each column:
          £    Ã                  # Iterate over the range [0..length) as Y:
           ZãYÄ                   #  Get the subsections of that column with length Y+1
                m®      }         # For each subsection:
                  rm              #  Get the minimum
                     *Zl          #  Multiply it by the length
                          c       #Flatten everything to a single list of possible rectangle sizes
                            rw    #Get the maximum

0

J , 38 байт

,"0/&(1+i.)/@$>./@,@:((#**/)@,;._3"$)]

Попробуйте онлайн!

как

,"0/&(1 + i.)/@$ >./@,@:((# * */)@,;._3"$) ]
              @$                             NB. pass the shape of
                                             NB. the input (rows, cols)
                                             NB. to...
,"0/&(1 + i.)/                               NB. this verb, which will
    &(1 + i.)/                               NB. will first create 2
                                             NB. lists: 1...num rows
                                             NB. and 1...num cols.
,"0/                                         NB. and then creat a cross
                                             NB. of every possible 
                                             NB. concatenation of the two,
                                             NB. giving us all possible 
                                             NB. rectangle sizes. pass 
                                             NB. that and...
                                           ] NB. the original input
                 >./@,@:((# * */)@,;._3"$)   NB. to this verb, which
                                   ;._3"$    NB. will take every 
                                             NB. possible rectangle of
                                             NB. every size,
                                 @,          NB. flatten it and...
                         (# * */)            NB. multiply the size of
                                             NB. the list by the list's 
                                             NB. product, yielding the
                                             NB. size of the list if it's
                                             NB. all ones, zero otherwise.
                     ,@:                     NB. Flatten all those results
                                             NB. into one big list
                 >./@                        NB. and take the max.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.