题目描述
给定一个正整数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.

相关文章:

  • 2021-11-18
  • 2021-08-22
  • 2022-12-23
  • 2021-05-18
  • 2021-07-03
  • 2022-02-20
  • 2021-12-20
  • 2022-12-23
猜你喜欢
  • 2021-06-14
  • 2021-05-17
  • 2022-12-23
  • 2021-07-26
  • 2022-03-03
  • 2022-01-23
相关资源
相似解决方案