您的位置:首页 > 其它

uva108 - Maximum Sum(最大和)

2013-04-14 15:54 274 查看
转来大神的话:

/**

 *  首先计算每一列的前序和(即0行到所有行上值的总和)

 *  其次,最大的子矩阵一定在a行和b行之间,所以我们可以枚举所有的可能组合,时间复杂度为O(N*N)

 *  因为我们在第一步中计算了前序和,那么第二步中a行和b行之间的子矩阵可以看成一个一维的数组,长度为N。

 *  其值的计算可以利用第一步中的前序和,遍历所有列,让0-b的总和减去0-a的总和,即为a-b的总和。

 *  利用该算法算出该一维数组中的最大连续子序列。时间复杂度为O(N),

 *  找出最大值,最后的时间复杂度为0(N*N*N)。
*/

自己的代码:

#include <cstdio>
#define M 150
int n, a[M][M];
int main ()
{
int max, sum, m;
while(scanf("%d",&n)!=EOF)
{
for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) {scanf("%d",&a[i][j]); a[i][j]+=a[i-1][j]; }
max = a[1][1];
for(int i = 0; i <= n; i++)
{
for(int j = i; j <= n; j++)
{
sum = 0;
for(int k = 1; k <= n; k++)//很巧妙的方法来找最大值!!!
{
if(sum<0) sum = 0;
sum+=a[j][k]-a[i-1][k];
if(sum>max) max = sum;
}
}
}
printf("%d\n",max);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: