题目描述
给定一个正整数n(n<=100),然后输入一个N*N矩阵。求矩阵中最大加权矩形,即矩阵的每一个元素都有一权值,权值定义在整数集上。从中找一矩形,矩形大小无限制,是其中包含的所有元素的和最大 。矩阵的每个元素属于[-127,127]
例:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
在左下角
9 2
-4 1
-1 8
和为15.
输入格式
第一行:n,接下来是n行n列的矩阵。
输出格式
最大矩形(子矩阵)的和。
样例输入
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
样例输出
15
//-----------------------------------------------------------------------------------------
分析:我们知道最大连续子序列和有O(N)的算法,这题可以通过枚举转化为求最大连续子序列.
我们枚举矩形的上下边界,将每一列的和累加到一行,求出最大连续子序列和,就是当前上下边界
的最大加权矩形的权值和.那么枚举完所有的矩形后,全局的最大加权矩形就求出来了.
复杂度是O(N^3).
code:
const oo=100000000;
var a,sum:array[0..110,0..110] of longint;
s:array[0..110] of longint;
n,i,j,k:longint;
ans,max,now,maxnow:longint;
function maxx(a,b:longint):longint;
begin
if a>b then exit(a); exit(b);
end;
begin
readln(n);
for i:=1 to n do
for j:=1 to n do read(a[i,j]);
for i:=1 to n do
for j:=1 to n do
sum[i,j]:=sum[i-1,j]+a[i,j];
max:=-oo;
for i:=1 to n do
for j:=i to n do
begin
fillchar(s,sizeof(s),0);
for k:=1 to n do
begin
now:=sum[j,k]-sum[i-1,k];
s[k]:=maxx(s[k-1]+now,now);
end;
maxnow:=-oo;
for k:=1 to n do
if s[k]>maxnow then maxnow:=s[k];
if maxnow>max then max:=maxnow;
end;
writeln(max);
end.