【蓝桥第二周】矩阵最大和

来源:互联网 发布:高斯朴素贝叶斯 数据 编辑:程序博客网 时间:2024/06/02 14:49
矩阵最大和
题目描述 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); }

1 0
原创粉丝点击