一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值。
例如:3*3的矩阵:
-1 3 -1
2 -1 3
-3 1 2
和最大的子矩阵是:
3 -1
-1 3
1 2
Input
第1行:M和N,中间用空格隔开(2 <= M,N <= 500)。 第2 - N + 1行:矩阵中的元素,每行M个数,中间用空格隔开。(-10^9 <= M[i] <= 10^9)
Output
输出和的最大值。如果所有数都是负数,就输出0。
Input示例
3 3 -1 3 -1 2 -1 3 -3 1 2
Output示例
7
#include <iostream>
using namespace std;
int input[500][500];
long long int sum[500][500];
long long int maxSumOfLine(long long int buf[], int m)
{
long long int result = 0;
long long int sum = 0;
for (int i = 0; i < m; i++)
{
if (sum < 0)
{
sum = buf[i];
}
else
{
sum += buf[i];
}
if (sum > result)
{
result = sum;
}
}
return result;
}
long long int fun(int m, int n)
{
long long int result = 0;
long long int buf[m];
for (int i = 0; i < m; i++)
{
sum[i][0] = input[i][0];
for (int j = 1; j < n; j++)
{
sum[i][j] = sum[i][j-1] + input[i][j];
}
}
for (int left = 0; left < n; left++)
{
for (int right = left; right < n; right++)
{
for (int i = 0; i < m; i++)
{
if (left == 0)
{
buf[i] = sum[i][right];
}
else
{
buf[i] = sum[i][right] - sum[i][left-1];
}
}
long long int temp = maxSumOfLine(buf, m);
if (temp > result)
{
result = temp;
}
}
}
return result;
}
int main()
{
int m, n;
cin >> n >> m;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cin >> input[i][j];
}
}
cout << fun(m, n) << endl;
return 0;
}