【原创】
最大子矩阵,也就是在一个矩阵中找一个子矩阵,使其和最大,至于所采用的思想便是求数组的最大子序列,比如1,2,-1,-1,3,这个数组的最大和就是本身为4;再比如1,2,-1,-3,4,这个数组额度最大子序列为4,即最后一个数,那么在矩阵中通过将各行相加,并找出相加后的数组的最大子序列和,便得解,至于详细原理,请百度最大子矩阵;这里提供一份代码,若输入数据进行调试,一看就会明了,注释也会引导
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 int N; 7 int a[101][101];//矩阵 8 int dp[101];//? 9 10 int getMaxArray(int a[], int N) {//求数组的最大子序列的和返回 11 int max = a[0], tmp = 0; 12 for (int i = 0; i < N; ++i) { 13 if (tmp > 0) {//子段的求法,比如说1,3,-5,4,3,tmp始终保持从前往后加是正数和的值,前面1,3,-5相加已经为-1,所以不可能和后面构成最大子段和了,此时的tmp要重新开始,因此tmp = a[i] 14 tmp += a[i]; 15 } else { 16 tmp = a[i]; 17 } 18 max = max > tmp ? max : tmp; 19 } 20 return max; 21 } 22 23 int main() { 24 while (scanf("%d", &N) != EOF) { 25 for (int i = 0; i < N; ++i) { 26 for (int j = 0; j < N; ++j) { 27 scanf("%d", &a[i][j]); 28 } 29 }//输入数组N*N 30 int res = a[0][0], tmp;//默认为a[0][0]; 31 for (int i = 0; i < N; ++i) {//会做N次; 32 memset(dp, 0, sizeof(dp));//每一次都会将dp数组清空为0 33 for (int j = i; j < N; ++j) { 34 for (int k = 0; k < N; ++k) {//这里k从0到n-1,下面是dp[k],说明dp数组只用了n单元,恰恰getMaxArray的参数就是dp,和N这一点的确符合;说明???? 35 dp[k] += a[j][k]; 36 } 37 tmp = getMaxArray(dp, N); 38 res = res > tmp ? res : tmp; 39 } 40 } 41 printf("%d ", res); 42 } 43 return 0; 44 }