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
- UVa 108
- uva 108
- UVA 108
- uva 108
- UVa 108 - Maximum Sum
- UVa 108 - Maximum Sum
- uva 108 - Maximum Sum
- UVa 108 - Maximum Sum
- UVa 108 - Maximum Sum
- UVa:108 Maximum Sum
- UVa 108: Maximum Sum
- UVA - 108 Maximum Sum
- UVA 108 Maximum Sum
- uva 108 Maximum Sum
- UVa 108 - Maximum Sum
- UVA 108 Maximum Sum
- UVA - 108 Maximum Sum
- uva 108 Maximum Sum
- 大数据学习篇:hadoop深入浅出系列之HDFS(六) ——JavaAPI操作
- 课程设计
- set serveroutput on
- hdu5475An easy problem 线段树
- java中代理模式以及new和newInatance()的区别
- uva 108
- 数据结构学习总结——数据结构概述
- 飞思卡尔MAPS四色板序列1
- 简单理解socket协议
- 1.6 CentOS7 配置AMP环境之MySQL
- 2015年9月25日滴滴出行在线编程题
- 杭电acm--2070
- 【从头开始学算法】快速排序
- 用顺序表求集合的交集、并集和差集