经典题, 计算子矩阵元素和的最大值
方法 : Kadane 算法的推广 ( 即O(N)求最大子序列的算法推广到矩阵)
思路 : 各自求出连续K行中每一列的和, 每得到一个序列, 用Kadane算法求出这个序列的最大子序列, 以此类推
可以用一个一维数组记录每一次的N列和, 从首行开始, 逐行向下, 每到一行就加上这一行的和, 检查maxSum
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <list>
#include <cassert>
#include <iomanip>
using namespace std;
const int MAXN = 100000;
const int BASE = 100000000;
typedef long long LL;
/*
uva 210
*/
int N;
int LineSum(const int seq[], int len){
int MaxSum = -1, ThisSum = 0;
for(int i=0; i<len; i++){
ThisSum += seq[i];
if( MaxSum < ThisSum ){
MaxSum = ThisSum;
}
if( ThisSum<0 ){
ThisSum = 0;
}
}
return MaxSum;
}
void func(const int arr[150][150]){
int top_r,r,c,i;
int ColSum[N];
int MaxSum = 0, ThisSum = 0;
for( top_r=0; top_r<N; top_r++){
memset(ColSum,0,sizeof(ColSum));
for( r=top_r; r<N; r++){
for( c=0; c<N; c++){
ColSum[c] += arr[r][c];
}
ThisSum = LineSum(ColSum,N);
if( MaxSum < ThisSum ){
MaxSum = ThisSum;
}
}
}
cout << MaxSum << endl;
}
int main(){
int arr[150][150];
memset(arr,0,sizeof(arr));
cin >> N;
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
cin >> arr[i][j];
}
}
func(arr);
return 0;
}