POJ-1050 К Max

До максимума
Лимит времени: 1000 мс   Ограничение памяти: 10000K
Всего Материалы: 56579   Принято: 29921

Описание

Учитывая двумерный массив положительных и отрицательных целых чисел, суб-прямоугольник любого прилегающий к югу массив размера 1 * 1 или больше , расположенным в пределах всего массива. Сумма прямоугольника равна сумма всех элементов в этом прямоугольнике. В этой задаче суб-прямоугольник с наибольшей суммой называются максимальным юг прямоугольник.
В качестве примера, максимальный суб-прямоугольник массива:

0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 0 -2 8
находится в нижнем левом углу:

9 2
-4 1
-1 8
и имеет сумму 15.

вход

Ввода состоит из N * N массива целых чисел. Ввода начинается с одного положительного целого числа N на отдельной строке, что указывает на размер квадратного двумерного массива. За этим следует N ^ 2 целых чисел, разделенных пробелами (пробелы и символы перевода строки). Эти N ^ 2 целые числа массива, представленные в строке-мажорной порядке. То есть, все числа в первом ряду, слева направо, то все числа во втором ряду, слева направо, и т.д. N может быть столь же большим, как 100. Числа в массиве будет находиться в диапазоне [-127,127] ,

Выход

Выход сумма максимального суб-прямоугольника.

Пример ввода

4
0 -2 -7 0 9 2 -6 2
-4 -4 1 1 -1

8 0 -2

Пример вывода

15

Источник

ID-OJ:
POJ-1050

Автор:
Caution_X

Дата представления:
20,191,117

Ключевые слова:
двумерная префикс массива и

описание моделирования:
вычисление двумерный массив весов и подматрицы Крупнейшими

основные шаги по ее решению:
перечисление I (i∈ [1 , н-]) для J (j∈ [+ 1, п]) для каждого одномерного массива столбцов и строк элементов, а значение максимального рассчитывается и обновляется ответ на одномерный массив непрерывных сечений правильных

предупреждений:
двумерный массив в одномерный массив с ручкой, сократить время накладные расходы

код переменного тока:

#include <stdio.h>
 #define MAXSIZE 101

// определить наибольший ряд суб-сегментов и 
INT MaxArray ( INT н-, INT arr_ [])
{
    Int я, sum_ = 0 , max_ = 0 ;
    для (I = 1 ; я <= п; я ++ )
    {
        если (sum_> 0 )
        {
            sum_ + = arr_ [I];
        }
        еще
        {
            sum_ = arr_ [I];
        }
        если (sum_> max_)
        {
            max_ = sum_;
        }
    }
    вернуться Max_;
}
// найти максимум и суб-матрицы. 
INT MaxMatrix ( INT н-, INT ARR _ [] [MAXSIZE])
{
    INT max_ arr_ = [ 1. ] [ 1. ];
     INT sum_;
     INT I, J, K;
     INT temp_arr [MAXSIZE]; 
     для (I = 1. , я <= п, я ++) // начиная с первой строки, пока п строк 
    {
         для (J = . 1 , J <= п; j ++) // изменяет только начальную строку, temp_arr инициализации массива перед 
        {
            temp_arr [J] = 0 ;
        }        
        для (I = J, J <= п; j ++) // из-я строка в п-й строки 
        {
             для (К = 1. , К <= п, К ++ )  
            {
                temp_arr [к] + = arr_ [J] , [к]; // temp_arr [к] представляет собой сумму к-го столбца и -й строки к н-й строке. 
            }         
            sum_ = MaxArray (н-, temp_arr); // определить наибольший ряд суб-сегментов и        
            ПЧ (sum_> max_)
            {
                max_ = sum_;
            }
        }
    }
    вернуться Max_;
}
Int основных ()
{
    ИНТ п;
    Int I, J;
    ИНТ arr_ [MAXSIZE] [MAXSIZE];
    INT max_;
    в то время как (~ зсапЕ ( " % d " , & п)) // 多组测试相当于зсапЕ ( "% d", & п) = EOF.! 
    {
         для (I = 1 ; я <= п; я ++ )
        {
            для (J = 1 , J = <N; j ++ )
            {
                зсапЕ ( " % d " , & arr_ [I] [J]);
            }
        }
        max_ = MaxMatrix (п, arr_);
        Е ( " % d \ п " , max_);
    }
    вернуться  0 ;
}

 

рекомендация

отwww.cnblogs.com/cautx/p/11879089.html
рекомендация