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

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

Sample Output

15

题意:求最大的子矩阵的和

解题思路:通过循环,用b[k]数组储存每列的和,例如当循环到第2行时,b[0]储存的就是5。 5是怎么来的呢?它是0+9+(-4)=5。
                                 b[1]储存的就是1。 -2+2+1=1 这样求出每列的和然后同时找b[k]序列的最大子段和,不断更新最大值,循环完之后,就可以找出最大值了..... 也许这样比较抽象,举个栗子:(这里就不用N行N列的做例子了.....) 2维数组:     
         1 2 3
        -5 6 7
     我们先求
          
          第0行   b数组 1 2 3                最大子段和:1+2+3=6  这里可以理解为  这是 1 2 3  这个子矩阵
          
          第1行
                b数组 -4 8 10                最大子段和:8+10=18  这里就是 2 3
                                       6 7  这个子矩阵                 所以答案就是18 怎么说,思想应该是通过求每列的和,使得它变成一个求最大字段和的问题......... 代码如下:(去掉注释,也许会对理解思路有帮助....)
 #include<stdio.h>
#include <limits>
#include<string.h>
using namespace std;
int a[][],b[];
int n,cursum=-,max=numeric_limits<int>::min(); int curmaxsum()
{
int sum=0,cursum=-130;
for(int i=; i<n; i++)
{
sum+=b[i];
if(sum<)
sum=b[i];
if(sum>cursum)
cursum=sum;
}
return cursum;
} int maxsub()
{
for(int i=; i<n; i++)
{
memset(b,,sizeof(b));
for(int j=i; j<n; j++)
{
//printf("\nj=%d\n",j);
for(int k=; k<n; k++)
{
b[k]+=a[j][k];
}
/*for(int k=0; k<n-1; k++)
printf("%d ",b[k]);
printf("%d\n",b[n-1]);*/ curmaxsum();
//printf("cursum=%d\n",cursum);
if(cursum>max)
max=cursum;
// printf("max=%d\n",max);
}
}
return max;
} int main()
{
while(scanf("%d",&n)==)
{
for(int i=; i<n; i++)
for(int j=; j<n; j++)
scanf("%d",&a[i][j]);
// printf("******************************\n\n");
maxsub();
printf("%d\n",max);
}
return ;
}


ZOJ 1074 最大子矩阵和的更多相关文章

  1. ZOJ 1074 To the Max(DP 最大子矩阵和)

    To the Max Time Limit: 2 Seconds      Memory Limit: 65536 KB Problem Given a two-dimensional array o ...

  2. ZOJ 1074 To the Max

    原题链接 题目大意:这是一道好题.在<算法导论>这本书里面,有一节是介绍如何求最大子序列的.这道题有点类似,区别是从数组变成了矩阵,求最大子矩阵. 解法:完全没有算法功底的人当然不知道最大 ...

  3. HDOJ 1081(ZOJ 1074) To The Max(动态规划)

    Problem Description Given a two-dimensional array of positive and negative integers, a sub-rectangle ...

  4. [LeetCode] 1074. 元素和为目标值的子矩阵数量

    矩阵前缀和.因为矩阵中可能包含负值,所以这题肯定不会存在什么剪枝,动态规划的可能性.所以这个题也就没什么弯弯绕绕.个人感觉算不上个Hard题目. 最直观的思路就是枚举子矩阵,既枚举矩阵的左上角节点和右 ...

  5. ZOJ 3367 Counterfeit Money(最大相同子矩阵)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3909 题意:给出两个矩阵A和B,找出最大的相同子矩阵S.输出S的高和 ...

  6. ZOJ题目分类

    ZOJ题目分类初学者题: 1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242 1251 1292 1331 13 ...

  7. ZOJ 刷题记录 (。・ω・)ノ゙(Progress:31/50)

    [热烈庆祝ZOJ回归] P1002:简单的DFS #include <cstdio> #include <cstring> #include <algorithm> ...

  8. ZOJ 1859 Matrix Searching(二维线段树)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1859 Matrix Searching Time Limit: 10 Seco ...

  9. ACM 中 矩阵数据的预处理 && 求子矩阵元素和问题

            我们考虑一个$N\times M$的矩阵数据,若要对矩阵中的部分数据进行读取,比如求某个$a\times b$的子矩阵的元素和,通常我们可以想到$O(ab)$的遍历那个子矩阵,对它的各 ...

随机推荐

  1. ios webview点击图片看大图效果及相应手势操作

    下面参考资料有比较详细的解释,在之前的就项目中也有比较好的效果(支持更多手势),可以参考下 参考资料

  2. linux- svn服务器

    环境:centos6.5 安装 centos 6.5默认安装了svn server, 这里直接使用.如果没有的话,使用yum -y install subversion安装 创建版本库 3.1 创建s ...

  3. 使用markdown及highlight

    一.markdown 安装markdown2 pip install markdown2 应用markdown2 进入blog APP,创建templatetags文件夹,在文件夹内创建__init_ ...

  4. H.264编码之IDCT变换原理

    上次讲到了DCT变换的推导过程,这次主要给大家讲下IDCT反变换的推导过程.建议大家先看上次讲的DCT变换公式推导过程.这样在看这篇文章时会容易很多!话不多说,让我们开始IDCT的旅程吧! IDCT反 ...

  5. [改善Java代码]不要只替换一个类

    建议20: 不要只替换一个类 我们经常在系统中定义一个常量接口(或常量类),以囊括系统中所涉及的常量,从而简化代码,方便开发,在很多的开源项目中已采用了类似的方法,比如在Struts2中,org.ap ...

  6. 新增html元素的使用

    今天学习HTML5中新增元素的使用 (Ⅰ)新增主体结构元素 Section元素:用于对网站或应用程序中的内容进行分块. <section> <h1></h1> &l ...

  7. SQL Server批量更新数据

    项目中有一个位置需要批量插入几万条数据,批量insert等待时间简直...用SqlBulkCopy后,之前需要1分钟左右的sql现在只要一眨眼(真的只要一眨眼) 稍后这个功能要加到另外一个项目中,另外 ...

  8. Java - 正则表达式常用操作

    验证 简单验证 String regex = "\\d{4}-\\d{2}-\\d{2}"; String input = "2016-01-01"; asse ...

  9. Linux 命令 - route: 显示或操作路由表

    route 命令查看路由表或者手动地添加.删除和修改路由表中的条目. 命令格式 route [-CFvnNee] [-A family] route [-v] [-A family] add [-ne ...

  10. Asp_CRUD

    Asp_增删改查.逻辑流程 启动服务器. 地址为127.0.0.1 端口为随机分配 2607 然后在浏览器中输入http://localhost:2670/CRUD_main.ashx 浏览器像服务器 ...