Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater located within the whole array. The sum of a rectangle is the sum of all the elements in that rectangle. In this problem the sub-rectangle with the largest sum is referred to as the maximal sub-rectangle.
The input consists of an N * N array of integers. The input begins with a single positive integer N on a line by itself, indicating the size of the square two-dimensional array. This is followed by N^2 integers separated by whitespace (spaces and newlines). These are the N^2 integers of the array, presented in row-major order. That is, all numbers in the first row, left to right, then all numbers in the second row, left to right, etc. N may be as large as 100. The numbers in the array will be in the range [-127,127].
Output the sum of the maximal sub-rectangle.
4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
15
题意:
给 N*N 的矩阵,找出某一个子矩阵,将其所有元素相加求和,求最大的和
即找一个最大的子矩阵和
例如:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
is in the lower left corner:
9 2
-4 1
-1 8
and has a sum of 15.
思路:
二维的直接求解太麻烦,我们转化成一维来求解
子矩阵也可以看成是原矩阵的某几行和某几列的和
上述例子可以看成是 第2行到第四行每一列相加求和,然后转化成一维的求一个最大字段和
比如:将第2行到第4行每一列相加求和得到: 4 11 -10 1
对这个一维数组求一个最大字段和结果是 15
因此:
我们可以遍历行与行的组合,对每一列求和,然后求最大字段和
行与行的组合关系有:1 1-2 1-3 1-4
2 2-3 2-4
3 3-4
4
因此遍历这几种关系队列求和即可
解决方法:
① 用三维数组sum[i][j][k] 分别代表 从第 i 行到第 j 行的第 k 列的和
② 对①中求得的结果进行最大字段和,我用的是动归
CODE:
#include
#include
#include
#include
#include
#define memset(a,n) memset(a,n,sizeof(a))
const int MAXX = 110;
using namespace std;
int sum[MAXX][MAXX][MAXX];
int dp[MAXX];
int n;
int maxSum(int r,int c)
{
int maxx = 0;
for(int i=0; i maxx)
maxx = dp[i];
}
return maxx;
}
int main()
{
int maxx,maxx1,maxx2;
int a[MAXX][MAXX];
memset(a,0);
memset(sum,0);
cin >> n;
for(int i=0; i> a[i][j];
maxx = -1;
for(int i=0; i