题目链接:http://poj.org/problem?id=1050;
思路:这道题目要求出最大子矩阵和,可以将二维矩阵计算转化为一维最大连续子数组和。依次遍历所有行,对于当前行i,分别求出row[i,i+1],row[i,i+1,i+2]…row[i,i+1,…i+n]的相同列j的和保存在对应的temp[j]中,这样就可以将二维矩阵计算转化为一维数组了。代码实现如下:
#include <iostream>
#include <cstring>
#define MAXN 101
using namespace std;
int arr[MAXN][MAXN], temp[MAXN], maxSum;
void subRectangle(int n) {
int dp = temp[0];
maxSum = max(dp, maxSum);
for (int i = 1; i < n; i++) {
dp = (dp >= 0) ? dp+temp[i] : temp[i];
maxSum = max(dp, maxSum);
}
}
void maxSubRectangle(int n) {
for (int i = 0; i < n; i++) {
//init temp
for (int j = 0; j < n; j++) {
temp[j] = 0;
}
//from row_i to row_n-1
for (int j = i; j < n; j++) {
for (int k = 0; k < n; k++) {
temp[k] += arr[j][k];
}
subRectangle(n);
}
}
}
int main() {
int n, num, res;
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> num;
arr[i][j] = num;
}
}
maxSum = arr[0][0];
maxSubRectangle(n);
cout << maxSum << endl;
return 0;
}