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

矩阵最大和
题目描述 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); 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值