Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1 x 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 x 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

4
0 -2 -7 0 9 2 -6 2
-4 1 -4 1 -1
8 0 -2
 

Sample Output

15
 
题意:给一个N*N的矩形数组,求其中元素和最大的子矩形,输出最大值。
解析:因为数据比较小,可以枚举每个矩形,但是求矩形和时可以预处理一下。可以设置一个数组比如RecSum[i][j],i,j分别代表行,RecSum[i][j]表示右下角坐标为(i,j)左上角为(1,1)的矩形元素和,那么求某个矩形时,如左上角坐标为(upx,upy),右下角坐标为(lowx,lowy),则体积 V=RecSum[lowx][lowy]-RecSum[upx][lowy]-(RecSum[lowx][upy]-RecSum[upx][upy]);最后找最大值即可。
 
 代码如下:
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<iterator>
#include<utility>
#include<sstream>
#include<iostream>
#include<cmath>
#include<stack>
using namespace std;
const int INF=1000000007;
const double eps=0.00000001;
int N,elem[101][101];
int RowSum[101][101],RecSum[101][101];
inline void Get_RowSum() //处理每一行的前m个数的元素和
{
memset(RowSum,0,sizeof(RowSum));
for(int x=1;x<=N;x++)
for(int y=1;y<=N;y++)
{
if(y==1) RowSum[x][y]=elem[x][y];
else RowSum[x][y]=RowSum[x][y-1]+elem[x][y];
}
}
inline void Get_RecSum() //得到RecSum[][]
{
memset(RecSum,0,sizeof(RecSum));
for(int x=1;x<=N;x++)
for(int y=1;y<=N;y++)
{
if(x==1) RecSum[x][y]=RowSum[x][y];
else RecSum[x][y]=RecSum[x-1][y]+RowSum[x][y];
}
}
inline int Get(int upx,int upy,int lowx,int lowy)
{
return RecSum[lowx][lowy]-RecSum[upx][lowy]-(RecSum[lowx][upy]-RecSum[upx][upy]);
}
int Cal(int row,int col)
{
int ret=-INF;
for(int i=0;i+row<=N;i++) //枚举每个矩形
{
for(int j=0;j+col<=N;j++)
{
int upx=i,upy=j,lowx=i+row,lowy=j+col;
ret=max(ret,Get(upx,upy,lowx,lowy));
}
}
return ret;
}
int main()
{
while(cin>>N)
{
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++) scanf("%d",&elem[i][j]);
Get_RowSum();
Get_RecSum();
int ans=-INF;
for(int row=1;row<=N;row++)  // 枚举矩形大小
for(int col=1;col<=N;col++)
ans=max(ans,Cal(row,col));
cout<<ans<<endl;
}
return 0;
}
 
 
 

PKU 1050-To The Max(找矩形内元素最大和)的更多相关文章

  1. lightOJ 1366 Pair of Touching Circles(统计矩形内相切圆对)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1366 题意:给出一个矩形,在内部画两个圆A和B使得AB都完全在矩形内且AB相切且AB的 ...

  2. POJ 1410 Intersection(判断线段交和点在矩形内)

    Intersection Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9996   Accepted: 2632 Desc ...

  3. 以log(n)的时间求矩形内的点

    设想这么一个简单的问题,在一个平面上有n个点,给定一个矩形,问位于矩形内的点有哪些. 这个问题的简单思路非常简单,每次遍历所有点,看其是否在给定的矩形中.时间复杂度呢?单次查询的时间就是一次遍历的时间 ...

  4. POJ 1050 To the Max 最大子矩阵和(二维的最大字段和)

    传送门: http://poj.org/problem?id=1050 To the Max Time Limit: 1000MS   Memory Limit: 10000K Total Submi ...

  5. POJ 1050 To the Max 最详细的解题报告

    题目来源:To the Max 题目大意:给定一个N*N的矩阵,求该矩阵中的某一个矩形,该矩形内各元素之和最大,即最大子矩阵问题. 解题方法:最大子序列之和的扩展 解题步骤: 1.定义一个N*N的矩阵 ...

  6. 洛谷P2241-统计方形-矩形内计算长方形和正方形的数量

    洛谷P2241-统计方形 题目描述: 有一个 \(n \times m\) 方格的棋盘,求其方格包含多少正方形.长方形(不包含正方形). 思路: 所有方形的个数=正方形的个数+长方形的个数.对于任意一 ...

  7. CSS里常见的块级元素和行内元素

    根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display属性值为“block”,成为“块级 ...

  8. CSS块级元素和行内元素

    根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display属性值为“block”,成为“块级 ...

  9. css盒模型和块级、行内元素深入理解

    盒模型是CSS的核心知识点之一,它指定元素如何显示以及如何相互交互.页面上的每个元素都被看成一个矩形框,这个框由元素的内容.内边距.边框和外边距组成,需要了解的朋友可以深入参考下 一.CSS盒模型 盒 ...

随机推荐

  1. 【转】Windows与Linux(Ubuntu)双系统时间不一致的解决方法

    当在嵌入式Linux里面备份文件时候,在备份的时候,PC(win7)和开发板的时间都是9:30,但是在开发板发现文件创建时间是9:30,然后u盘插在PC(win7)上,发现文件创建时间是1:30,为什 ...

  2. Java实现将指定目录内的指定类型的文件归类

    这两天在学Java IO流,正好让我产生了将自己的电子书归类的打算,说做就做,Why not?看着自己所学所用能解决生活中的实际问题,是不是非常有成就感,那是必须的! package DepthSea ...

  3. [Elasticsearch] 部分匹配 (三) - 查询期间的即时搜索

    本章翻译自Elasticsearch官方指南的Partial Matching一章. 查询期间的即时搜索(Query-time Search-as-you-type) 如今让我们来看看前缀匹配可以怎样 ...

  4. thinkphp框架的路径问题 - 总结

    thinkphp框架的路径问题 - 总结 (2011-06-21 11:01:28) 转载▼ 标签: thinkphp 框架 路径 杂谈 分类: Php TP中有不少路径的便捷使用方法,比如模板中使用 ...

  5. iOS多线程及其感悟

    感觉每天都是匆匆忙忙的,每天似乎都是时间不够用一样,可是等真的想要动手敲代码的时候才发现,原来还有好多好多的知识点不是太熟练,所以,人不可以一直感觉自我良好, 有时间就是那种自我感觉良好的心态毁了自己 ...

  6. jstl数字保留两位小数

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%><fmt:fo ...

  7. maven:安装m2eclipse插件

    一.安装maven 1.下载maven:http://pan.baidu.com/s/1hqIbx6s 2.解压并配置path路径(直接替换最新的maven包,即可升级) 3.测试 二.安装m2ecl ...

  8. 装Oracle12C时遇到没有权限访问临时位置的解决方法

    今天在装oracle12c是遇到了一个很奇怪的问题,显示是没有权限访问临时位置,可是我明明是用管理员的账号登陆的啊,最后在包姐的帮助下解决了,知其然,而我却不知其所以然.但还是把方法写下,希望能帮到一 ...

  9. 利用IIS7 解决URL访问限制问题

    网站可以通过URl直接访问一些不希望被访问的东西, 比如一些图片,js,css等等. 为了解决这个问题看了好多文章,不过毕竟我是新手菜鸟级别的,没有具体的解决方法,真心不知道怎么弄. 今天在看IIS的 ...

  10. jQuery 双击事件(dblclick)时,不触发单击事件(click)

    我这是转载的文字 原文地址:http://www.cnblogs.com/wyblog/archive/2011/12/15/2289219.html 万恶的双击事件啊!! 在jQuery的事件绑定中 ...