最大和
时间限制:1000 ms | 内存限制:65535 KB
难度:5
-
描述
-
给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
例子:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
其最大子矩阵为:9 2
-4 1
-1 8
其元素总和为15。-
输入
- 第一行输入一个整数n(0<n<=100),表示有n组测试数据;
每组测试数据:
第一行有两个的整数r,c(0<r,c<=100),r、c分别代表矩阵的行和列;
随后有r行,每行有c个整数;
输出 - 输出矩阵的最大子矩阵的元素之和。 样例输入
-
1 4 4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
样例输出 -
15
思路:
根据一维矩阵求最大和的dp算法拓展到二维矩阵内即可求解。
#include <stdio.h> #include <string.h> #include <stdlib.h> int map[101][101], max, n, m; void findmax(int row) //一维的求最大和 { int i, temp = 0; for(i = 0; i < m; i++) { if(temp > 0) { temp += map[row][i]; } else { temp = map[row][i]; } if(temp > max) { max = temp; } } } int main() { int i, j, k, t; scanf("%d", &t); while(t--) { memset(map, 0, sizeof(map)); //初始化数组(不初始化也可以。。。) scanf("%d%d", &n, &m); for(i = 0; i < n; i++) { for(j = 0; j < m; j++) { scanf("%d", &map[i][j]); } } max = map[0][0]; for(i = 0; i < n; i++) //矩形的上边界为i { findmax(i); for(j = i+1; j < n; j++) //矩形的下边界为j { for(k = 0; k < m; k++) { map[i][k] += map[j][k]; //扩充矩形 } findmax(i); //转化为一维矩形求最大和 } } printf("%d\n", max); } return 0; }
- 第一行输入一个整数n(0<n<=100),表示有n组测试数据;