HDU1081-To The Max【最大子段和 前缀和】

博客介绍了如何解决HDU1081问题,通过矩阵压缩转换为最大子段和问题。文章阐述了如何使用前缀和优化算法,将二维矩阵压缩为一维进行动态规划,以提高效率。作者分享了解题思路,并鼓励读者提问和交流。
摘要由CSDN通过智能技术生成

HDU1081-To The Max

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1081.
题目大意::
在给定 n*n 大小的矩阵中找出所有元素和相加最大的矩阵。

那么这道题应该怎样切入思考呢?
刚开始拿到这道题,似乎除了枚举矩阵的上下左右区间来暴力求解没什么其他思路,但这显然会超时。
这也是本题的切入点,如果我们合并压缩那些本来要枚举的行,那么就变成了求最大子段和问题。这么说可能有些难以理解,让我们来举个例子。
有这样一个3x3的矩阵:

1  -2  3
-4  5 -6
7  -8  9

他存在的最大子阵和,这个子矩阵的行数肯定是 {1},{2},{3},{1,2},{2,3},{1,2,3}中的一种,那么对于行数超过2的子矩阵,这里用{2,3}举例:

-4  5 -6
7  -8  9

对于每一列的元素例如第一列的-4 和7,要么一起加上求和,要么都不取,因此就可以看成一个元素,那么每次所枚举的任何列长的矩阵,我们都可以把同一列上的元素压缩捆绑,需要当成最大子段和问题处理即可。

压缩后:

3  -3 3

那么对于列长从ij上元素的捆绑,最基本的做法当然就是简单的循环相加,但是这样操作效率较低,这时就要用到前缀和的应用,相当于对于1~n列上的和的预处理,代码如下:

for(int i=1;i<=n;i++){
   
	for(int j=1;j<=n;j++){
   
		cin>>a[i][j];   //在输出原矩阵数据的同时顺带完成前缀和,提高效率
		ans=max(ans,a[i][j]);
		sum[i][j]=sum[i-1]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值