uva 108

来源:互联网 发布:360软件管家电脑版 编辑:程序博客网 时间:2024/04/30 10:47

原题

经典题, 计算子矩阵元素和的最大值

方法 : 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;}


0 0