时间限制:3秒
空间限制:32768K
热度指数:443
算法知识视频讲解
题目描述
有一个正整数和负整数组成的NxN矩阵,请编写代码找出元素总和最大的子矩阵。请尝试使用一个高效算法。
给定一个int矩阵mat和矩阵的阶数n,请返回元素总和最大的子矩阵的元素之和。保证元素绝对值小于等于100000,且矩阵阶数小于等于200。
测试样例:
[[1,2,-3],[3,4,-5],[-5,-6,-7]],3
返回:10
思路:
(以第一行最为开始)先求第一行的最大和,然后将第二行数据加到第一行,
再求此时的最大值,然后再将下一行加上去,求最大值......最终得到第一列到最后一列的最大值;
还要计算第二行到最后一行的最大和,第三行到最后一行的最大和;
代码如下:
#include<iostream>
#include<vector>
using namespace std;
//找出该数组的最大子数组和
int helper(vector<int> &a){
int temp = a[0];
int maxVal = temp;
for (int i = 1; i < a.size(); i++){
if (temp < 0){
temp = a[i];
}
else{
temp += a[i];
}
if (temp > maxVal){
maxVal = temp;
}
}
return maxVal;
}
int sumOfSubMatrix(vector<vector<int> > mat, int n)
{
// write code here
int maxVal = -(1 << 31);
for (int i = 0; i < n; i++){
vector<int> temp = mat[i];
maxVal = max(maxVal, helper(temp));
for (int j = i + 1; j < n; j++){
for (int k = 0; k < n; k++){
temp[k] += mat[j][k];
}
maxVal = max(maxVal, helper(temp));
}
}
return maxVal;
}
int main()
{
vector<vector<int> > n;
vector<int> v;
int m;
int temp;
while (cin >> m)
{
for (int i = 0; i<m; i++)
{
v.clear();
for (int j = 0; j < m; j++)
{
cin >> temp;
v.push_back(temp);
}
n.push_back(v);
}
cout << sumOfSubMatrix(n, m) << endl;
}
return 0;
}
不懂的可以加我的QQ群:261035036(IT程序员面试宝典
群) 欢迎你的到来哦,看了博文给点脚印呗,谢谢啦~~