poj 1005

Time Limit: 1000MS Memory Limit: 10000K 64bit IO Format: %I64d& %I64u

[Submit [GoBack  [Status]

Description

Given a two-dimensional array of positive andnegative integers, a sub-rectangle is any contiguous sub-array ofsize 1*1 or greater located within the whole array. The sum of arectangle is the sum of all the elements in that rectangle. In thisproblem the sub-rectangle with the largest sum is referred to asthe maximal sub-rectangle. 
As an example, the maximal sub-rectangle of thearray: 

0 -2 -7 0 
9 2 -6 2 
-4 1 -4 1 
-1 8 0 -2 
is in the lower left corner: 

9 2 
-4 1 
-1 8 
and has a sum of 15. 

Input

The input consists of an N * N array of integers.The input begins with a single positive integer N on a line byitself, indicating the size of the square two-dimensional array.This is followed by N^2 integers separated by whitespace (spacesand newlines). These are the N^2 integers of the array, presentedin row-major order. That is, all numbers in the first row, left toright, then all numbers in the second row, left to right, etc. Nmay be as large as 100. The numbers in the array will be in therange [-127,127].

Output

Output the sum of the maximal sub-rectangle.

Sample Input

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

8  0 -2

Sample Output

15

#include<iostream>
using namespace std;
int a[101][101],f[101],d[101];
 int main()
 {
         int n,i,j,k,max;
         while(cin>>n)
         {

             max=-1000;
                 for(i=1;i<=n;i++)
                         for(j=1;j<=n;j++)
                         cin>>a[i][j];

                 for(i=1;i<=n;i++)
                 {
                         memset(f,0,sizeof(f));
                         for(j=i;j<=n;j++)
                           for(k=1;k<=n;k++)
                         {
                          f[k]+=a[j][k];

                                if(f[k]+d[k-1]>0)
                                d[k]=f[k]+d[k-1];
                                else  d[k]=0;

                                if(max<d[k])
                                max=d[k];

                                         }
                          }
                         cout<<max<<endl;
         }
         return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值