矩阵最大和
题目描述 Description
题目描述 Description
给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
输入描述 Input Description第一行有两个的整数r,c(0<r,c<=100),r、c分别代表矩阵的行和列;
随后有r行,每行有c个整数;输出描述 Output Description
样例输入 Sample Input
4 4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
样例输出 Sample Output
15
[解题思路]
其实就是最大子数组的扩展,加多一个对行的控制即可,注意先相加map[i][j] += map[i - 1][j],方便用dp[k] = map[j][k] + map[i - 1][k],求出第k列i到j的和(看不懂的,或者不能理解的的,看代码,打表一行一行认真耐心看)。
[代码实现]
#include<stdio.h>
using namespace std;
#define N 110
int map[N][N],dp[N];
int main()
{
int i, j, k, x, y;
scanf("%d%d", &x, &y);
for(i = 1; i <= x; i ++)
{
for(j = 1; j <= y; j ++)
{
scanf("%d", &map[i][j]);
map[i][j] += map[i - 1][j];
/* 若这里不相加,在计算i-1到j的和时,需要
dp[k]=0;
for(int m=i-1;m<=j;m++) dp[k] += map[m][k];
*/
}
}
int MaxN = map[1][1];
for(i = 1; i <= x; i ++) /* i控制从第几行开始 */
{
/* cout<<"————————————i——————————————————————"<<i; */
for(j = i; j <= x; j ++) /* j控制到第几行结束 */
{
/* cout<<"————————————j——————————————————————"<<j; */
for(k = 1; k <= y; k ++) /* k控制列*/
{
dp[k] = map[j][k] - map[i - 1][k]; /* d[k]为i-1到j的和 */
/* cout<<d[k]<<endl */
if(dp[k - 1] > 0) /* 如果前一列之和大于0加上 */
dp[k] += dp[k - 1];
if(dp[k] > MaxN) MaxN = dp[k];
}
}
}
printf("%d\n", MaxN);
}