最大子矩阵c语言思路,[蓝桥杯][历届试题]最大子阵 (C++代码)

本文介绍了一种优化方法,通过避免使用max函数和矩阵输入优化,将计算复杂度从O(nm²)降低到处理大规模数据,如500x500矩阵,能在700ms内完成。关键在于使用三目运算符处理子阵和,同时注意处理负值子阵以防止错误结果。
摘要由CSDN通过智能技术生成

解题思路:

即便是使用了dp,复杂度依然是O(nm²),在一些优化技巧的帮助下,勉强可以承受最大为500的数据规模的打击,时间在700ms上下

注意事项:

优化:不要用算法模板里的max,直接用三目运算符或者if语句

矩阵不要用cin输入了,cin比scanf耗时不少,在这种严苛的情形下比较重要

坑:

拒绝值为负的子阵,否则会可能会削减最大子阵的值,导致答案错误!

参考代码:#define _CRT_SECURE_NO_WARNINGS

#include 

#include 

#include 

#include 

#include 

#define N 500

using namespace std;

int dp[N + 2][N + 2];

int A[N + 2][N + 2];

int solve(int n, int m)

{

int ans = A[1][1];

//初始化dp数组

for (int i = 1; i <= n; i++)

for (int j = 1; j <= m; j++)

dp[i][j] = dp[i][j - 1] + A[i][j];

//计算最大子阵

for (int first = 1; first <= m; first++)

{

for (int last = first; last <= m; last++)

{

int subMatrixSum = 0;

for (int i = 1; i <= n; i++)

{

subMatrixSum += dp[i][last] - dp[i][first - 1];

ans = ans > subMatrixSum ? ans : subMatrixSum;

subMatrixSum = subMatrixSum > 0 ? subMatrixSum : 0;//重要,拒绝负子阵。否则有可能会削减最大子阵的值,导致错误结果

}

}

}

return ans;

}

int main()

{

int m, n;

cin >> n >> m;

for (int i = 1; i <= n; i++)

for (int j = 1; j <= m; j++)

cin >> A[i][j];

cout <

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值