最大子矩阵题解

题目链接点击打开链接

思路

拿样例来说

4

0 -2 -7 0

9 2 -6 2

-4 1 -4 1

-1 8 0 -2

一边读入的时候一边求前缀和

for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
			scanf("%d",&x),a[i][j]=a[i][j-1]+x;
我们只需要前缀和所以读入的就没有了,另外开一个数组也可以

然后这个4*4的a[i][j]矩阵变成了

 0  -2  -9  -9

 9  11  5   7

-4  -3  -7  -6

-1   7    7   5

这样有了前缀和之和我们不必要for一遍求和了,而只要a[w][i]-a[w][j]就可以得到第w行从j+1到i的和

这样子我们首先两个for循环模拟子矩阵的行i=1 to n,j=0 to i-1

这样只是一行所以我们得再for一遍w模拟竖排

把它压缩成了一竖排

a[1][i],a[2][i]...a[w][i]——求最大子串和!

代码附上

#include<algorithm>
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
	int ans=-21000000,a[101][101]={0},tot,x,n,y[101];
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
			scanf("%d",&x),a[i][j]=a[i][j-1]+x;//前缀和
	for (int i=1;i<=n;i++)
		for (int j=0;j<i;j++)//模拟行的长度
		{
			//memset(y,0,sizeof(y));//这里可以不memset,反正每次处理都是处理前一个处理过的
			for (int w=1;w<=n;w++)
			{
				if (a[w][i]+y[w-1]<0) y[w]=0;
				else
					y[w]=y[w-1]+a[w][i]-a[w][j];//a[w][i]-a[w][j]等于a[w][j+1]到a[w][i]的和
				ans=max(ans,y[w]);
			}//上面四行求最大子串和,最大子串和也就是小于0的就复制为零,最后取max
		}
	printf("%d",ans);
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值