题目描述
给定一个正整数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列的矩阵。
输出格式
最大矩形(子矩阵)的和。
输入/输出例子1
输入:
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
输出:
15
具体代码
#include<bits/stdc++.h>
using namespace std;
void construction(int n,int m,int array[][101],int prefix[][101])
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
prefix[i][j]=prefix[i-1][j]+prefix[i][j-1]-prefix[i-1][j-1]+array[i][j];
}
}
}
int regionsum(int n,int m,int xf,int xs,int yf,int ys,int prefix[][101])
{
return prefix[xs][ys]-prefix[xf-1][ys]-prefix[xs][yf-1]+prefix[xf-1][yf-1];
}
int n,a[101][101],m[101][101],ans=-1000000;
int main(){
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
}
}
construction(n,n,a,m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int x=i;x<=n;x++)
{
for(int y=j;y<=n;y++)
{
ans=max(ans,regionsum(n,n,i,x,j,y,m));
}
}
}
}
cout<<ans;
return 0;
}