題目鏈接: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;
}