uva10827 循环矩阵的最大子矩阵

大意

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

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

分析

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

A

复制成

 

A A
A A

 

这样复制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.
原文地址:https://www.cnblogs.com/htfy/p/3034054.html