您的位置:首页 > 其它

uva10827 循环矩阵的最大子矩阵

2013-04-21 16:49 309 查看

大意

给出一个矩阵,上下左右相连,求最大子矩阵。

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=&problem=1768

分析

相连只有上下、左右两种情况,因此我们只要将

A
复制成

AA
AA
这样复制4份就行了。然后枚举矩形,用O(1)时间算出矩阵和。O(N^4) (个人认为不是最优,求交流)。卡常数,详见代码。

program p10827;

Const
dx:array[1..3] of longint=(0,1,1);
dy:array[1..3] of longint=(1,0,1);

Var
a:array[-1..160,-1..160] of longint;
t,f:array[-1..160] of longint;
n,tt,i,j,k,l,ans:longint;
begin

readln(tt);
while tt>0 do begin dec(tt);

readln(n);
for i:=1 to n do
begin
for j:=1 to n do
begin
read(a[i,j]);
for k:=1 to 3 do
a[i+dx[k]*n,j+dy[k]*n]:=a[i,j];
end;
readln;
end;

ans:=-maxlongint;
//枚举矩阵,O(1)求和 O(N^4)
for i:=1 to n do
for j:=1 to n do
for k:=0 to n-1 do
for l:=0 to n-1 do
begin
t[l]:=t[l-1]+a[i+k,j+l]; //Sum (i+k,j) ~ (i+k,j+l)
if k=0 then f[l]:=t[l] else inc(f[l],t[l]);   //F[ (k,) l]:对于以(i,j)为左上角,(k,l)为右下角矩形之和
if f[l]>ans then ans:=f[l];
end;
writeln(ans);
end;

end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: