/*
* 这道题类似于航电1003的那个max sum,
* 使用的是贪心算法求解
* 对于一个序列的数字,他的最大子序列是这样求的
* 前n项相加记录最大值max,当小于0时就放弃前n项,置总和sum为0,
* 因为小于0的序列与后面的序列相加是无益的,越加越小
*
* 本题,把一个大矩阵分为宽度不变、长度从n到1递减的子矩阵
* 然后把子矩阵按列相加,同列的数加到一起,得到一个类似1003题的数字序列
* 从而通过求该序列的max sum得到这个子矩阵的相同高度、不同宽度、和最大的子矩阵
* 外层循环控制高度改变,内层控制宽度最大且和最大
*/
#include <cstdio>
#include <cstring>
#include <limits.h>
const int ARRAY=101;
int map[ARRAY][ARRAY];
int main()
{
int foo(int);
int n=0;
while(EOF!=scanf("%d",&n))
{
for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
{
scanf("%d",&map[i][j]);
}
}
printf("%d\n",foo(n));
}
return 0;
}
int foo(int n)
{
int max=-INT_MAX;
for(int i=0;i<n;++i)
{
int array[ARRAY];
memset(array,0,ARRAY*sizeof(int));
int sum=0;
for(int j=i;j<n;++j)
{
sum=0;
for(int k=0;k<n;++k)
{
array[k]+=map[k][j];
sum+=array[k];
if(sum>max)max=sum;
if(sum<0)sum=0;
}
}
}
return max;
}
杭电 acm 1181 To The Max
最新推荐文章于 2025-08-06 17:01:48 发布