最大子矩阵和经典问题,利用最大字段和的思想
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 110;
int A[maxn][maxn];
int n;
int max_sub_array(int B[], int n)
{
int i = 0;
int sum = 0;
int max = 0;
for(; i<n; i++)
{
sum += B[i];
if(sum>max)
max = sum;
else if(sum<0)
sum = 0;
}
return max;
}
int max_sub_matrix()
{
int i;
int j;
int k;
int last_i = 0;
int last_j = 0;
int max = 0;
int tmp = 0;
int array[maxn];
for(i=0; i<n; i++)
{
for(k=0; k<n; k++)
array[k] = 0;
for(j=i; j<n; j++)
{
for(k=0; k<n; k++)
array[k] += A[j][k];
tmp = max_sub_array(array, n);
if(tmp>max)
{
last_i = i;
last_j = j;
max = tmp;
}
}
}
return max;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
scanf("%d",&A[i][j]);
printf("%d\n",max_sub_matrix());
}
return 0;
}