题目:最大加权矩形
题目描述
给定一个正整数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; }