您的位置:首页 > 其它

求一个M*N的矩阵的最大子矩阵和。

2013-07-01 10:03 232 查看
/*
copyright@nciaebupt 转载请注明出处
题目:求一个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 <cstdlib>
#include <iostream>

int maxSubArray(int * array, int len){
if(array == NULL || len < 1)  return -1;
int max = -10000;
int b = 0;
for(int i = 0; i < len; ++i){
if(b > 0){
b += array[i];
}
else{
b = array[i];
}
if(b > max) max = b;
}
return max;
}

int maxSubMatrix(int matrix[][4], int rowlen, int collen){
if(matrix == NULL || rowlen < 1 || collen < 1) return -1;
int max = -10000;
int array[collen];
for(int i = 0; i < rowlen; ++i){
for(int j = 0; j < collen; ++j){//init array to 0
array[j] = 0;
}
for(int j = i; j < rowlen; ++j){//from row i to row j
for(int k = 0; k < collen; ++k){
array[k] += matrix[j][k];
}
int maxarray = maxSubArray(array, collen);
if(maxarray > max)  max = maxarray;
}
}
return max;
}

int main(int argc, char ** argv){
int matrix[][4] = {{0,-2,-7,0},{9,2,-6,2},{-4,1,-4,1},{-1,8,0,-2 }};
int collen = sizeof(matrix)/sizeof(matrix[0]);
int rowlen = sizeof(matrix)/(sizeof(collen)*sizeof(int));
//std::cout<<"rowlen : "<<rowlen<<"collen : "<<collen<<std::endl;

int max = maxSubMatrix(matrix, rowlen, collen);

std::cout<<"max : "<<max<<std::endl;

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐