一、題目要求
給定一個矩陣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;
}