#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAX 1000int MaxSubInterval(int a[], int n) //标准的一维最大子段和 { int sum = 0, tp = 0; for(int i=0; i<n; i++) { if(tp > 0) tp += a[i]; else tp = a[i]; if(sum < tp) sum = tp; } return sum;}int MaxSubMartix(int a[][MAX], int m, int n) //二维最大子段和问题{ int tp[MAX], sum = 0; for(int i=0; i<m; i++) { memset(tp, 0, sizeof(tp) ); for(int j=i; j<m; j++) { for(int k=0; k<n; k++) tp[k] += a[j][k]; int max = MaxSubInterval(tp, n); if(max > sum) sum = max; } } return sum;}/*int MaxSubInterval(int a[], int n, int size_y) //一维的n个数的最大子段和 { int sum = 0, tp; for(int i=0; i<n-size_y; i++) { tp = 0; for(int j=i; j<i+size_y; j++) { if(tp > 0) tp += a[j]; else tp = a[j]; } if(sum < tp) sum = tp; } return sum;}int MaxSubMartix(int a[][MAX], int m, int n, int size_x, int size_y) //二维size_x * size_y 个数的最大子段和{ int tp[MAX], sum = 0; for(int i=0; i<m-size_x; i++) { memset(tp, 0, sizeof(tp) ); for(int j=i; j<i+size_x; j++) { for(int k=0; k<n; k++) tp[k] += a[j][k]; } int max = MaxSubInterval(tp, n, size_y); if(max > sum) sum = max; } return sum;}*/