题目描述
给定一个正整数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列的矩阵。
输出格式
最大矩形(子矩阵)的和。
题解:
用动态规划求最大加权矩形问题。
代码实现:
#include<iostream>
using namespace std;
int f[101][101]={0},n;
int main()
{
int i,j,k,l;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>f[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f[i][j]+=f[i-1][j];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f[i][j]+=f[i][j-1];
int max=-100000;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
for(k=1;k<=n;k++)
for(l=1;l<=k;l++)
if(f[i][k]-f[j-1][k]-f[i][l-1]+f[j-1][l-1]>max)
max=f[i][k]-f[j-1][k]-f[i][l-1]+f[j-1][l-1];
cout<<max<<endl;
return 0;
}