最大子矩阵
暴力版
#include<bits/stdc++.h>
using namespace std;
int Max=-1000,m,n,a[55][55];
int f(int x,int y,int t1,int t2)//求以x,y为起点,长t1,宽t2的矩阵之和
{
int i,j,sum=0;
for(i=x;i<=x+t1;i++)
{
for(j=y;j<=y+t2;j++)
{
sum+=a[i][j];
}
}
return sum;
}
int main( )
{
int i,j,k,m,n,t1,t2,t3,t4;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
int temp=a[i][j];
for(t1=0;i+t1<=n;t1++)
{
for(t2=0;j+t2<=m;t2++)
{
Max=max(Max,f(i,j,t1,t2));
}
}
}
}
printf("%d",Max);
}
dp版
#include<bits/stdc++.h>
using namespace std;
int Max=-1000,m,n,dp[55][55];
int main( )
{
int i,j,k,m,n,t1,t2,t3,t4;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&t1);
dp[i][j]=dp[i-1][j]+t1;//求出从第1行到第i行的每列之和
}
}
for(i=1;i<=n;i++)
{
for(j=i;j<=n;j++)
{
int sum=0;
for(k=1;k<=m;k++)//找出从第i行到第j行之间的最大子矩阵
{
sum+=dp[j][k]-dp[i-1][k];
Max=max(Max,sum);
sum=max(sum,0);//当sum小于0时令sum为0
}
}
}
printf("%d",Max);
}