【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 108488
  • 排名 - 229

最新评论

阅读排行榜

评论排行榜

Problem
Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1 x 1 or greater located within the whole array. The sum of a rectangle is the sum of all the elements in that rectangle. In this problem the sub-rectangle with the largest sum is referred to as the maximal sub-rectangle.

As an example, the maximal sub-rectangle of the array:

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.

The input consists of an N x N array of integers. The input begins with a single positive integer N on a line by itself, indicating the size of the square two-dimensional array. This is followed by N 2 integers separated by whitespace (spaces and newlines). These are the N 2 integers of the array, presented in row-major order. That is, all numbers in the first row, left to right, then all numbers in the second row, left to right, etc. N may be as large as 100. The numbers in the array will be in the range [-127,127].


Output

Output the sum of the maximal sub-rectangle.


Example

Input

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

Output

15

【参考程序】:

var a,s:array[0..100,0..100]of int64;
    n,i,j,k,x1,y1,x2:longint;
    max,m:int64;
begin
    
while not eof do
    begin
        read(n);
        
if n=0 then break;
        
for i:=1 to n do
          
for j:=1 to n do
            read(a[i,j]);
        
for i:=0 to n do
        begin
            s[
0,i]:=0;
            s[i,
0]:=0;
        end;
        
for x1:=1 to n do
         
for y1:=1 to n do
           s[x1,y1]:
=a[x1,y1]+s[x1,y1-1];//计算好S矩阵,方便下面计算
        max:=-maxlongint;
        
for x1:=1 to n do
          
for x2:=x1 to n do
          begin
              m:
=s[1,x2]-s[1,x1-1];
              
if m>max then max:=m;
              
for k:=2 to n do
              begin
                
if m>0 then m:=m+s[k,x2]-s[k,x1-1]//大于0就累加起来
                else m:=s[k,x2]-s[k,x1-1];//小于0就是展现自己,如果加了上面的m会使我还小.
                if m>max then max:=m;
              end;
          end;
        writeln(max);
    end;
end.
posted on 2009-03-29 08:59 开拓者 阅读(96) 评论(0)  编辑 收藏 引用 所属分类: 动态规划&背包

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理