uva108 - Maximum Sum(最大和)

转来大神的话:

/**

 *  首先计算每一列的前序和(即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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值