Re: Максимальная сумма

From
Sergey Andrianov (2:5020/1507.400)
To
Serg Belyaev
Date
2002-05-03T13:32:14Z
Area
RU.ALGORITHMS
Здравствуй, Serg!

Однажды 25-Apr-02  в 23:25   Serg Belyaev (2:5015/166.7)
написал       All    по поводу
-=-   Максимальная сумма  -=-

SB> Вот попалась интересная задачка 108 (acm.gui.uva.es/problemset)

SB> Дан 2-мерный массив положительных и отрицательных целых чисел,
SB> найти подпрямоугольник с наибольшей суммой. Сумма прямоугольника
SB> это сумма всех элементов этого прямоугольника.
SB> Пример:

SB>                         0 -2 -7  0
SB>                         9  2 -6  2
SB>                        -4  1 -4  1
SB>                        -1  8  0 -2

SB> тогда подпрямоугольник с максимальной суммой:

SB>                            9  2
SB>                           -4  1
SB>                           -1  8

SB> и сумма равна 15.

   1. Можно решать влоб, тогда при размере массива M*N и прямоугольника L*K временнАя сложность будет M*N*L*K. 
   2. Можно применить скользящее окно, тогда вместо вычисления суммы L*K на каждом шаге берется один раз вычисленная, а затем по мере прдвижения от нее вычитается тот столбец (строка), который "покинул" прямоугольник, и прибавляется тот, который "вошел" в него. Сложность порядка M*N*min(L+K).
   3. Дальнейшее уменьшение сложности можно сделать при выделении дополнительной памяти: Сначала выделяем массив шириной (M-L+1) и высотой N. В каждую ячейку массива записываем сумму подстроки длиной L, которую вычисляем из предыдущей путем добавления и вычитания по одному числу (опять скользящим окном). Сложность этого этапа M*N. Дальше выделяем второй массив такой же ширины и высотой (N-K+1). В него аналогично записываем суммы по столбцам. Сложность (M-L+1)*N. Эти суммы по столбцам и есть суммы в прямоугольнике, можно сразу искать максимум. Итого, сложность M*N.


                  До свидания,  в  13:21 MSK
                                 Sergey

---
 * Origin: Sergiev Posad (2:5020/1507.400)