最大子矩阵和

来源:互联网 发布:excel2003软件官方下载 编辑:程序博客网 时间:2024/05/03 03:53

题目:

求一个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 1