洛谷 P1719最大加权矩形

P1719最大加权矩形

题目描述

矩阵的每一个元素都有一权值,权值定义在整数集上。从中找一矩形,矩形大小无限制,是其中包含的所有元素的和最大 。即求最大加权矩形。

输入输出格式

输入格式:

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

输出格式:

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

思路分析

此题要将二维的矩阵压缩成一维,然后对压缩后的序列求最大子序列即可。
压缩方法:
将需压缩的行 对应列的元素相加 存入新的数组即可。
如本题例子:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
第一二行压缩后为 9 0 -13 2 最大子序列和为9
第一二三行压缩后为5 2 -17 3 最大子序列和为7
依次将各行组合压缩,求出的最大子序列和即为最大子矩阵的和。

具体代码实现如下:

#include<bits/stdc++.h>
using namespace std;
int a[150][150],b[150]={0},c[150];
main()
{
int n;
int k,ans = INT_MIN;
cin >> n;
for(int j = 1;j <= n;j++)
{
for(int i = 1;i <= n;i++)
cin >> a[j][i];
}
for(int j = 1;j <= n;j++) //列举所有行的组合可能
for(int k = j;k <= n;k++)
{
for(int m = j;m <= k;m++)
for(int i = 1;i < n;i++)
b[i]+=a[m][i]; //b[i]即为压缩后的序列
for(int i = 1;i <= n;i++) //查找最大子序列和
{
if(i < 2) c[i] = b[i];
else c[i] = max(b[i],c[i-1]+b[i]);
ans = max(ans , c[i]);
}
for(int i = 0;i <= n;i++)
b[i]=0;
}
cout << ans;
}

总结与体会

学习新的知识最重要的是能够理解,实现对所学内容的活学活用,不能只被动刻板的接受,必须要多加思考,弄清楚每一处的细节,这样才能掌握知识的精髓,从而达到事半功倍的效果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值