uva108 Maximum sum(矩阵最大和)

该博客介绍了如何解决UVA108问题,即寻找给定n*n矩阵中的最大和子矩阵。解题方法是枚举起点和终点,计算所有可能的子矩阵和,并保留最大值。通过横向和纵向遍历矩阵,可以快速得到所有子矩阵的和,从而找到最大值。举例说明了计算过程,并提及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目;uva108 Maximum sum(矩阵最大和)


题目大意:给出一个n*n的矩阵,求这个矩阵的最大和。这个矩阵不是连通的,只能在这个矩阵内找子矩阵,不能越过边界。


解题思路:枚举起点和终点,每个起点和终点就是一个矩阵,每个矩阵都算矩阵和,然后保留最大值。每个矩阵的值只要横着相加一遍,再竖着相加一遍,就可以得出以这个矩阵为起点的所有的子矩阵的和(这里可以直接要这个矩阵的和,因为里面的子矩阵枚举起和终点的时候都会算到),然后记录最大值。

例如 : 2 2 3

           3 3  4

横着相加  2 4 7

                 3 6 10

再竖着相加 2 4 7

                    5  10 17

整个矩阵的和是17

两行一列的和是5

两行两列的和是10

...

只要求以这个起点和终点的矩阵的和就可以了。

代码:

#include <stdio.h>
#include <string.h>

const int N = 150;
const int INF = 0x3f3f3f3f;
int mat[N][N], temx[N], temy[N];

int Max (const int x, const int y) {return x > y? x: y;}

int main () {

	int n;
	while (scanf ("%d", &n) != EOF) {
	
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
				scanf ("%d", &mat[i][j]);

		int mm = -INF;
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++) {

				memset (temx, 0, sizeof (temx));
				for (int x = i; x < n; x++)
					for (int y = j; y < n; y++) {

						if (y == j)
							temy[y] = mat[x][y];
						else
							temy[y] = temy[y - 1] + mat[x][y];
						temx[y] += temy[y];
						mm = Max (mm, temx[y]);
						mm = Max (mm, temy[y]);
					}
			}
		printf ("%d\n", mm);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值