题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1081
题目大意:给你一个n*n的二维数组, 让你求一个子矩阵, 要求输出和最大的是多少?
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cstdlib> 6 #include <cmath> 7 #include <set> 8 #include <map> 9 #include <vector> 10 using namespace std; 11 12 int a[110][110], c[110][110], n;//c[i][j] 表示第 i 行前 j 个数的和 13 int main() 14 { 15 while(~scanf("%d", &n)) 16 { 17 memset(c, 0, sizeof(c)); 18 for(int i = 1; i <= n; i++){ 19 int m = 0; 20 for(int j = 1; j <= n; j++){ 21 scanf("%d", &a[i][j]); 22 m += a[i][j]; 23 c[i][j] = m; 24 } 25 } 26 int MAX = a[1][1]; 27 for(int i = 1; i <= n; i++) 28 { 29 for(int j = i; j <= n; j++)// 把每行的c[1][j] - c[1][i] 当成一个数, 竖着看, 为一列数, 求这列数的最大连续子序列 30 { 31 int m = 0; 32 for(int k = 1; k <= n; k++) 33 { 34 m += c[k][j] - c[k][i - 1]; 35 if(m > MAX) 36 MAX = m; 37 if(m < 0)//当小于0时,m重新赋值 38 m = 0; 39 } 40 } 41 } 42 printf("%d ", MAX); 43 } 44 return 0; 45 }