传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1081
题意:
给定一个 n*n 的矩阵, 求其中和最大的子矩阵思路:
读入时预处理出前缀和(a[i][j] = sum(in[0..i][j])), o(n^2)枚举行数可能, o(n) 求出当前可能的最大子矩阵. (开始以为是什么高深的压缩技巧, 后来才发现就是暴力枚举…….)
#include <stdio.h>
#include <iostream>
#include <cstring>
using namespace std;
const int MAX = 111;
const int INF = 1 << 20 -1;
int n, ary[MAX][MAX], tary[MAX], ans, tans, tmp;
int main() {
while (cin >> n) {
//init
ans = -INF;
//getin
for (int i = 1; i <= n; ++i)
for (int j = 0; j < n; ++j) {
cin >> ary[i][j];
ary[i][j] += ary[i-1][j];
}
//judge
for (int i = 0; i < n; ++i) {
for (int j = i+1; j <= n; ++j) {
tans = -INF, tmp = 0;
for (int k = 0; k < n; ++k) {
tmp += ary[j][k] - ary[i][k];
if (tmp > tans)
tans = tmp;
else if (tmp < 0)
tmp = 0;
}
ans = ans > tans ? ans : tans;
}
}
cout << ans << endl;
}
return 0;
}
2017-10-13 划水日常