这是一道求最大子矩阵和的题,之前做过求最大一维数列连续和,所以可以将每列
压缩到一列,将二维变成一维,这样枚举所有的情况,找到一个一维最大连续和即可。
/* Accepted 216K 32MS C++ 775B 2012-04-11 09:05:12 */ #include<cstdio> #include<cstring> #include<cstdlib> #define MAXN 105 #define max(a, b) ( a > b ? a : b) const int inf = 0x3f3f3f3f; int t[MAXN][MAXN], a[MAXN]; int ans, n; void dp( int *a) //这个函数和求最大连续和没区别 { int sum = 0; for( int i = 1; i <= n; i ++) { sum = max( sum + a[i], 0); ans = max( sum, ans); } } int main() { while( scanf( "%d", &n) == 1) { ans = -inf; for( int i = 1; i <= n; i ++) for( int j = 1; j <= n; j ++) scanf( "%d", &t[i][j]); for( int i = 1; i <= n; i ++) //i是子矩阵的起始行 for( int j = i; j <= n; j ++) //j是子矩阵的结束行 { memset( a, 0, sizeof a); for( int k = 1; k <= n; k ++) //k代表每列 for( int tt = i; tt <= j; tt ++) //由i到j压缩到一列 { a[k] += t[tt][k]; } dp( a); } printf( "%d\n", ans); } return 0; }
浙公网安备 33010602011771号