Bruteforce должен нормально работать при n <100, если он правильно реализован: приведенное ниже решение имеет O (n ^ 4) время и O (n ^ 2) сложность памяти.10 ^ 8 операций на современном ПК должны занимать менее 1 секунды (особенно если учесть, что каждая операция очень дешевая: мало сложений и вычитаний). </p>
Некоторые наблюдения
- Есть O(n ^ 4) под прямоугольников для рассмотрения, и каждый из них может быть решением.
- Если мы можем найти число 1 и 0 в каждом под прямоугольнике в O (1) (постоянное время), мыРешим задачу за O (n ^ 4) раз.
- Если мы знаем число 1 в некотором под прямоугольнике, мы можем найти количество нулей (через область).
Итак, проблема сводится к следующему: создать структуру данных, позволяющую найти число единиц в каждом под прямоугольнике за постоянное время .
Теперь представьте, что у нас есть под прямоугольник [i0..i1]x[j0..j1]
.То есть он занимает строки между i0 и i1 и столбцы между j0 и j1.И пусть count_ones
будет функцией для подсчета количества единиц в подпрямоугольнике.
Это основное наблюдение:
count_ones([i0..i1]x[j0..j1]) = count_ones([0..i1]x[0..j1]) - count_ones([0..i0 - 1]x[0..j1]) - count_ones([0..i1]x[0..j0 - 1]) + count_ones([0..i0 - 1]x[0..j0 - 1])
То же наблюдение с практическим примером:
AAAABBB
AAAABBB
CCCCDDD
CCCCDDD
CCCCDDD
CCCCDDD
Если нам нужно найти число 1 в под прямоугольнике D (3x4), мы можем сделать это, взяв число 1 во всем прямоугольнике (A + B + C + D), вычтя число 1 в (A +)B) прямоугольник, вычитая число 1 в (A + C) прямоугольнике, и добавляя число 1 в (A) прямоугольнике.(A + B + C + D) - (A + B) - (A + C) + (A) = D
Таким образом, нам нужна таблица sums
, для каждого i
и j
, содержащая количество единиц в под прямоугольнике [0..i][0..j]
.
Вы можете создать эту таблицу в O (n ^ 2), но даже прямой способ его заполнения (для каждой i
и j
итерации всех элементов [0..i][0..j]
области) будет O (n ^ 4).
Наличие этой таблицы,
count_ones([i0..i1]x[j0..j1]) = sums[i1][j1] - sums[i0 - 1][j1] - sums[i1][j0 - 1] + sums[i0 - 1][j0 - 1]
Следовательно, сложность времени O (n ^ 4) достигнута.