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

题目大意

输入一个N(N最大100),然后输入N2 个数(每个数的取值范围为:[-127, 127] ),N * N的矩阵,找其中的子矩阵所有元素和最大的值

解题思路

每行的数等于当前行加上之前行的数,前缀和

$a[i][j] = a[i - 1][j] + 当前数$

假设一开始,数组存储状态如图所示:

每行数据的每一列 等于 当前列之前行的所有数之和(包括当前行)

从第x( 1 <= x <= n )行开始

到第y ( x <= y <= n )行结束。遍历找的最大子段和

num[y][k] - num[x - 1][k]就是第k列的第x行到第y行的所有数之和

其实就是把第x行到第y行每一列的数按列加起来,变成一维数组

然后找其最大子段和

下面是AC代码:

#include <cstdio>
#include <cstdlib>
#include <memory.h> #define N 105 int num[N][N]; int main()
{
int n;
while (~scanf("%d", &n))
{
memset(num, 0, sizeof(num));
int temp;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
scanf("%d", &temp);
num[i][j] = num[i - 1][j] + temp;
}
} int max = 0;
int sum; for (int i = 1; i <= n; i++)
{
for (int j = i; j <= n; j++)
{
sum = 0;
for (int k = 1; k <= n; k++)
{
temp = num[j][k] - num[i - 1][k];
sum = sum > 0 ? sum + temp : temp;
max = sum > max ? sum : max;
}
}
}
printf("%d\n", max);
}
return 0;
}

To the Max(动态规划)的更多相关文章

  1. HDU 1081 To The Max(动态规划)

    题目链接 Problem Description Given a two-dimensional array of positive and negative integers, a sub-rect ...

  2. [ACM_动态规划] POJ 1050 To the Max ( 动态规划 二维 最大连续和 最大子矩阵)

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

  3. POJ 1050 To the Max -- 动态规划

    题目地址:http://poj.org/problem?id=1050 Description Given a two-dimensional array of positive and negati ...

  4. 动态规划算法(java)

    一.动态规划算法 众所周知,递归算法时间复杂度很高为(2^n),而动态规划算法也能够解决此类问题,动态规划的算法的时间复杂度为(n^2).动态规划算法是以空间置换时间的解决方式,一开始理解起来可能比较 ...

  5. 连续子数组的最大和 java实现

    package findMax; /** * 连续子数组的最大和 * @author root * */ public class FindMax { static int[] data = {1,- ...

  6. 【动态规划】HDU 1081 & XMU 1031 To the Max

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1081 http://acm.xmu.edu.cn/JudgeOnline/problem.php?i ...

  7. HDOJ-1003 Max Sum(最大连续子段 动态规划)

    http://acm.hdu.edu.cn/showproblem.php?pid=1003 给出一个包含n个数字的序列{a1,a2,..,ai,..,an},-1000<=ai<=100 ...

  8. HDU 1024 Max Sum Plus Plus【动态规划求最大M子段和详解 】

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  9. HDU 1003 Max Sum【动态规划求最大子序列和详解 】

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

随机推荐

  1. Linux用户和组管理命令-用户创建useradd

    用户管理命令 useradd usermod userdel 组帐号维护命令 groupadd groupmod groupdel 用户创建 useradd 命令可以创建新的Linux用户 格式: u ...

  2. java面试题目之JVM(YW制作仅供参考)

    1.JVM工作原理 2.JVM组成部分及其作用. java虚拟机分为两个子系统和两个组件. 两个子系统分别是类加载器和执行引擎,类加载器负责加载字节码(.class)文件到JVM的内存中,执行引擎负责 ...

  3. win7下安装docker

    为了支持老版本的windows系统,docker官方提供了docker toolbox,让用户可以在windows10以前版本的操作系统上来体验docker. 一,安装 下载msi安装文件,一路nex ...

  4. .NET CORE WebAPI JWT身份验证

    一.appsettings.Json文件配置 配置JWT公用参数. 1 /*JWT设置*/ 2 "JwtSetting": { 3 "Issuer": &quo ...

  5. Mysql JDBC-mysql-Driver queryTimeout分析

    Mysql jdbc的queryTimeout分析 Mysql的jdbc-driver com.mysql.jdbc.Driver 设置queryTimeout方法 com.mysql.jdbc.St ...

  6. 支持向量机(SVM)必备概念(凸集和凸函数,凸优化问题,软间隔,核函数,拉格朗日乘子法,对偶问题,slater条件、KKT条件)

    SVM目前被认为是最好的现成的分类器,SVM整个原理的推导过程也很是复杂啊,其中涉及到很多概念,如:凸集和凸函数,凸优化问题,软间隔,核函数,拉格朗日乘子法,对偶问题,slater条件.KKT条件还有 ...

  7. JUC---10JMM

    前提:什么是Volatile? Java 虚拟机提供轻量级的同步机制 1.保证可见性------->JMM 2.不保证原子性 3.禁止指令重排 一.什么是JMM 1.JMM : Java内存模型 ...

  8. java数据结构-06双向循环链表

    双向循环链表跟单向链表一样,都是头尾相连,不过单向是尾指向头,双向是头尾互相指,可以从前往后查,也可以从后往前查 无头结点的双向循环链表 public class CircleLinkedList&l ...

  9. SQL Server双机热备之发布、订阅实现实时同步

    一.复制的功能概述 SQL Server 复制功能实现了主从库的分离,从而将主库的压力分解掉,主库就主要负责数据的更改等,而主库主要负责查询ji.另外,有了主.从库,则从另一个方面,也了一层安全性,即 ...

  10. Django中间件(Middleware)处理请求

    关注公众号"轻松学编程"了解更多. 1.面向切面编程 切点(钩子) 切点允许我们动态的在原有逻辑中插入一部分代码 在不修改原有代码的情况下,动态注入一部分代码 默认情况,不中断传播 ...