一、题目要求
给定一个矩阵matrix,其中的值有正有负,有0,返回子矩阵的最大累加和,例如,矩阵matrix为:
-90 48 78
64 -40 64
-81 07 66
其中,最大累加和的子矩阵为:
48 78
-40 64
-7 66
所以返回累加和209
二、解题思路
将矩阵matrix[N][N]的每一列的N个元素累加成一个累加数组,然后求出这个数组的最大累加和,这个最大累加和就是所求子矩阵的最大累加和
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
int max(int x, int y)
{
return (x > y) ? x : y;
}
//子矩阵的最大累加和问题:
//题目要求:给定一个矩阵matrix,其中的值有正有负,有0,返回子矩阵的最大累加和
//解题思路:
//将矩阵matrix[N][N]的每一列的N个元素累加成一个累加数组,然后求出这个数组的最大累加和,这个最大累加和就是所求子矩阵的最大累加和
int maxSum(vector<vector<int>>& matrix)
{
int maxres = 0;
int cur = 0;
int* s = new int[matrix[0].size()]; //累加数组
for (int i = 0; i != matrix.size(); ++i)
{
for (int i = 0; i < matrix[0].size(); ++i) //注意:对每行进行累加前,要将累加数组s清零
s[i] = 0;
for (int j = i; j != matrix.size(); ++j)
{
cur = 0;
for (int k = 0; k != matrix[0].size(); ++k)
{
s[k] += matrix[j][k];
cur += s[k];
maxres = max(maxres, cur);
cur = cur < 0 ? 0 : cur;
}
}
}
delete[] s;
return maxres;
}
int main()
{
vector<vector<int>> matrix;
vector<int> temp;
string str;
int t;
int row = 3;
while (row--)
{
temp.clear();
{
for (int i = 0; i < 3; ++i)
{
cin >> t;
temp.push_back(t);
}
matrix.push_back(temp);
}
}
int res = maxSum(matrix);
cout << res << endl;
system("pause");
return 0;
}