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