最大子矩阵和

题目:

求一个M*N的矩阵的最大子矩阵和。
比如在如下这个矩阵中:
 0 -2 -7  0
 9  2 -6  2
-4  1 -4  1
-1  8  0 -2 
拥有最大和的子矩阵为:
 9 2
-4 1
-1 8
其和为15。

 

思路:二维转成一维,用一维的最大连续子序列求和即可。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*从a中找到最大连续子序列的和*/
int getSubMaxSum(int *a, int n)
{
    int sum = *a;
    int tmp = 0;
    int i;
    for (i=0; i<n; i++)
    {
        tmp += a[i];
        /*如果当前和比历史记录大,则更新*/
        if (tmp > sum)
        {
            sum = tmp;
        }
        if (tmp < 0)
        {
            /*如果小于0,则从下一个重新开始计算*/
            tmp = 0;
        }
    }   return sum;
}
/*row:行长度
  col:列长度
  算法思想参考:http://blog.csdn.net/YCH1035235541/article/details/8260687
*/
int getSubMaxArray(int arr[][4], int row, int col)
{
    int i;
    int j;
    int k;
    int sum = 0;
    int tmp = 0;
    
    int rec[255];
    
    for (k=0; k<row; k++)/*k表示从k开始求最大子矩阵*/
    {
        memset(rec, 0, sizeof(rec));
        for (i=k; i<row; i++)
        {
            for (j=0; j<col; j++)
            {
                rec[j] += arr[i][j];  /*累加a[k][0]到a[row][col]的值到数组*/
            }
            tmp = getSubMaxSum(rec, col);
            if (sum < tmp)
            {
                sum = tmp;
            }
        }
    }
    
    return sum;
}
int main()
{
    int a[][4] =
        {
            {0, -2, -7, 0},
            {9, 2, -6, 2},
            {-4, 1, -4, 1},
            {-1, 8, 0, -2},
        };
        
    printf("sum %d\n", getSubMaxArray(a, 4, 4));
    return 0;
}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值