蓝桥杯 PREV-26 最大子阵(二维最大子序列和)

题目链接:

PREV-26 最大子阵

思路:

首先我们需要学会求一维最大子序列和(这里就不多赘述啦)
此题我们枚举这个子矩阵的上底和下底即原矩阵的两行,对于原矩阵的每一列我们都用前缀和数组记录下来;
假设现在枚举第r和第rr行,我们设立数组v(下标从1m),v[i]的值即为原矩阵a[r][i] + a[r + 1][i] + ... + a[rr][i],此时我们只需求一维数组v的最大子序列和即可;
时间复杂度 O ( m n 2 ) O(mn^2) O(mn2),但是常数不大,可以AC

代码:

#include<bits/stdc++.h>

using namespace std;

const int maxn = 505;
int n, m, a[505][505], sum[505][505];

int main() {
#ifdef MyTest
	freopen("Sakura.txt", "r", stdin);	
#endif
	scanf("%d %d", &n, &m);
	int ans = -5005;
	for(int i = 1; i <= n; ++i)
	for(int j = 1; j <= m; ++j)
	{ scanf("%d", &a[i][j]); ans = max(ans, a[i][j]); }
	if(ans <= 0) { cout << ans; exit(0); }
	for(int j = 1; j <= m; ++j)
	for(int i = 1; i <= n; ++i)
		sum[i][j] = (i ? sum[i - 1][j] : 0) + a[i][j];
	for(int r = 1; r <= n; ++r)
	for(int rr = r; rr <= n; ++rr) {
		vector<int> v(m + 1);
		for(int j = 1; j <= m; ++j) v[j] = sum[rr][j] - sum[r - 1][j];
		int rcd = 0;
		for(int i = 1; i <= m; i++) {
			if(rcd < 0) rcd = 0;
			rcd += v[i];
			ans = max(ans, rcd);
		}
	}
	cout << ans;
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值