博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1050To the Max
阅读量:6520 次
发布时间:2019-06-24

本文共 2501 字,大约阅读时间需要 8 分钟。

Description

Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater located within the whole array. The sum of a rectangle is the sum of all the elements in that rectangle. In this problem the sub-rectangle with the largest sum is referred to as the maximal sub-rectangle.
As an example, the maximal sub-rectangle of the array:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
is in the lower left corner:
9 2
-4 1
-1 8
and has a sum of 15.

Input

The input consists of an N * N array of integers. The input begins with a single positive integer N on a line by itself, indicating the size of the square two-dimensional array. This is followed by N^2 integers separated by whitespace (spaces and newlines). These are the N^2 integers of the array, presented in row-major order. That is, all numbers in the first row, left to right, then all numbers in the second row, left to right, etc. N may be as large as 100. The numbers in the array will be in the range [-127,127].

Output

Output the sum of the maximal sub-rectangle.

Sample Input

40 -2 -7 0 9 2 -6 2-4 1 -4  1 -18  0 -2

Sample Output

15 题目的大意就是说在给出的n*n个数组成的矩形中饭找出一个小矩形,使得这些数的和最大。 这道题可以借鉴求最大和的连续子序列的方法来做; 在i,j行之间求出每一列这之间的和,那么这个和的最大连续子序列和就是所求 如样例:  0 -2 -7  0  9  2 -6  2 -4  1 -4  1 -1  8  0 -2 假如在第一行到第三行之间求每一列的和那就是 -13 1 -17 3 这个序列的最大连续区间的和就是举行的高为1-3行之间的最大矩形里的和 那么我们就只需要枚举所有行的区间就行了,连续区间最大和的球阀复杂度是O(n),枚举所有行是O(n^2),所以总的复杂度就是O(n^3)。n<=100所以不会超时
1 #include 
2 #include
3 #include
4 #include
5 #define MAX(a,b) (a) > (b)? (a):(b) 6 #define MIN(a,b) (a) < (b)? (a):(b) 7 #define mem(a) memset(a,0,sizeof(a)) 8 #define INF 1000000007 9 #define MAXN 10510 #define MAXC 100511 using namespace std;12 13 int N,ma[105][105];14 int sumU[105][105],sum[105];15 int main()16 {17 while(~scanf("%d",&N))18 {19 mem(sumU);20 int i,j,ans = -INF;21 for(i=1;i<=N;i++)for(j=1;j<=N;j++)22 {23 scanf("%d",&ma[i][j]);24 sumU[i][j]=sumU[i-1][j]+ma[i][j];25 }26 int Top,Down;27 for(Top=0;Top
0?0:(sumU[Down][1]-sumU[Top][1]);34 for(i=2;i<=N;i++)35 {36 if(min<0)min=(sumU[Down][i]-sumU[Top][i]);37 else min+=(sumU[Down][i]-sumU[Top][i]);38 if(max

 

转载于:https://www.cnblogs.com/gj-Acit/archive/2013/05/30/3109349.html

你可能感兴趣的文章
冲浪科技获Ventech China数百万美元天使轮融资,发力自动驾驶行业
查看>>
通过ActionTrail监控AccessKey的使用
查看>>
从 JavaScript 到 TypeScript
查看>>
一个mysql复制中断的案例
查看>>
【最佳实践】OSS开源工具ossutil-大文件断点续传
查看>>
Linux常用的服务器构建
查看>>
深入了解 Weex
查看>>
Android第三方开源FloatingActionButton(com.getbase.floatingactionbutton)【1】
查看>>
【75位联合作者Nature重磅】AI药神:机器学习模型有望提前五年预测白血病!
查看>>
精通SpringBoot——第二篇:视图解析器,静态资源和区域配置
查看>>
JavaScript基础(六)面向对象
查看>>
总结几点Quartz的经验
查看>>
从veth看虚拟网络设备的qdisc
查看>>
企业的最佳选择?开放式混合云大行其道
查看>>
物联网、自动化的冲击下未来20年职场六大趋势
查看>>
《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.6.2 使用StAX解析器
查看>>
9月26日云栖精选夜读:阿里Java代码规约插件即将全球首发,邀您来发布仪式现场...
查看>>
北京市交管局联合高德地图发布北京中考出行提示
查看>>
如何防止应用程序泄密?
查看>>
一文带你看懂物联网开源操作系统
查看>>