【最大矩阵和】最大加权矩形 rqnoj106

本文详细解析了最大加权矩形问题的算法实现,通过将矩阵压缩为一行并利用最大子区间和的方法,解决了寻找矩阵中具有最大权重和的矩形的问题。文章提供了完整的C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最大加权矩形rqnoj106

题目描述

给定一个正整数n( n<=100),然后输入一个N*N矩阵。求矩阵中最大加权矩形,即矩阵的每一个元素都有一权值,权值定义在整数集上。从中找一矩形,矩形大小无限制,是其中包含的所有元素的和最大 。矩阵的每个元素属于[-127,127]
例:
0 –2 –7 0 在左下角: 9 2
9 2 –6 2 -4 1
-4 1 –4 1 -1 8
-1 8 0 –2 和为15

输入格式

第一行:n,接下来是n行n列的矩阵。

输出格式

最大矩形(子矩阵)的和。

样例输入

4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2

样例输出

15

 

这一题可以说是前面  【贪心】旅游路线   那一题的升级版,这个是取一个矩形

同样,需要把所选的矩形压缩到一行,然后样最大子区间和来解决

建议先看看旅游路线那一题http://www.cnblogs.com/oijzh/archive/2012/10/19/2731052.html

我们需要一个sum[i][j]来存储第j列的前i行之和,比如样例中sum[3][2]=-2+2+1=1

分别枚举要取矩形的上边行数 i 和下边行数 j ,然后用sum[j][k]-sum[i-1][k]就是压缩到一行的第k列的值,然后就可以用递推来求出最大子区间和:用f[k]表示以 k 结尾的最大子区间和,记cc=sum[j][k]-sum[i-1][k],那么f[k]=max(f[i-1]+cc,cc);并同时找最大值

 

C++ Code

/*
C++ Code
http://oijzh.cnblogs.com
*/
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAXN 110
#define INF 0x7fffffff

int n,a[MAXN][MAXN],sum[MAXN][MAXN];//sum[i][j]表示第j列前i行之和
int f[MAXN];

int main()
{
    freopen("rqn106.in","r",stdin);
    freopen("rqn106.out","w",stdout);
    scanf("%d",&n);
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            scanf("%d",&a[i][j]);
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            sum[i][j]=sum[i-1][j]+a[i][j];
    int k,maxx=-INF;
    for(i=1;i<=n;i++)
        for(j=i;j<=n;j++)
            for(k=1;k<=n;k++)
            {
                int cc=sum[j][k]-sum[i-1][k];
                f[k]=max(f[k-1]+cc,cc);
                maxx>?=f[k];
            }
    printf("%d",maxx);
    return 0;
}

 

 

转载于:https://www.cnblogs.com/oijzh/archive/2012/10/19/2731678.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值