【编程之美】2.15 子数组之和的最大值(二维)

思路,有了一维的思路,我们想办法把二维问题转化为一维的问题。

我们假定已经选中了行的范围是 a-c 那么把每一列中 a-c的元素加起来就变成了一个一维的问题。只需对行的范围遍历,再用一维的方法来解就可以了。

注意,也可以对列的范围遍历,行和列那个小就对哪个遍历。 复杂度为O(M * N * min(M, N))

#include <stdio.h>
#include <stdlib.h>


void getSumCol(int * a, int aColNum, int RowBegin, int RowEnd, int * SumColArray)
{
    for(int j = 0; j < aColNum; j++)
    {
        SumColArray[j] = 0;
        for(int i = RowBegin; i <= RowEnd; i++)
        {
            SumColArray[j] += *(a + i * aColNum + j);
        }
    }
}

int getMax2DArraySum(int * a,const int aRowNum,const int aColNum)
{
    int MaxSum = a[0];
    int Sum = 0;
    int * SumColArray = (int *)calloc(aColNum, sizeof(a[0]));
    for(int i = 0; i < aRowNum; i++)
    {
        for(int k = i; k < aRowNum; k++)
        {
            getSumCol(a, aColNum, i, k, SumColArray);

            Sum = SumColArray[0];
            for(int j = 1; j < aColNum; j++)
            {
                Sum = (Sum > 0) ? Sum + SumColArray[j] : SumColArray[j];
                MaxSum = (Sum > MaxSum) ? Sum : MaxSum;
            }
        }
    }
    free(SumColArray);

    return MaxSum;
}

int main()
{
    int a[4][5] = {
        { 1, 2, 3, 4, 5},
        {-3,-5, 3,-8, 0},
        { 2, 3, 5, 6, 8},
        { -3,1, 2, 3, 0}
    };

    int max = getMax2DArraySum((int*)a, 4, 5);

    return 0;
}

 

转载于:https://www.cnblogs.com/dplearning/p/4087178.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值