RQNOJ106_最大加权矩形

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

转载于:https://www.cnblogs.com/exponent/archive/2011/08/08/2130602.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值