题目描述:

已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。
比如,如下4 * 4的矩阵

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

的最大子矩阵是

9 2
-4 1
-1 8

这个子矩阵的大小是15。

输入:

输入是一个N * N的矩阵。输入的第一行给出N (0 < N <= 100)。
再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。
已知矩阵中整数的范围都在[-127, 127]。

输出:

测试数据可能有多组,对于每组测试数据,输出最大子矩阵的大小。

样例输入:
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
样例输出:
15

第一映像是暴力枚举,不过显然会超时,然后就想到了DP。其实因为矩阵肯定是对齐的,所以如我们将两行加起来求最大子数组就可以得到一个行数为2的子矩阵。所以问题就转化成了求一个数组的最大子数组和。然后就是枚举第i行到第j行相加得到的数组了。注意res的值不能设为0,因为可能最后的结果是负数。

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; int N;
int a[][];
int dp[]; int getMaxArray(int a[], int N) {
int max = a[], tmp = ;
for (int i = ; i < N; ++i) {
if (tmp > ) {
tmp += a[i];
} else {
tmp = a[i];
}
max = max > tmp ? max : tmp;
}
return max;
} int main() {
//freopen("input.txt", "r", stdin);
while (scanf("%d", &N) != EOF) {
for (int i = ; i < N; ++i) {
for (int j = ; j < N; ++j) {
scanf("%d", &a[i][j]);
}
}
int res = a[][], tmp;
for (int i = ; i < N; ++i) {
memset(dp, , sizeof(dp));
for (int j = i; j < N; ++j) {
for (int k = ; k < N; ++k) {
dp[k] += a[j][k];
}
tmp = getMaxArray(dp, N);
res = res > tmp ? res : tmp;
}
}
printf("%d\n", res);
}
return ;
} /**************************************************************
Problem: 1139
User: hupo250
Language: C++
Result: Accepted
Time:60 ms
Memory:1560 kb
****************************************************************/

[Jobdu] 题目1139:最大子矩阵的更多相关文章

  1. [Jobdu] 题目1497:面积最大的全1子矩阵

    题目描述: 在一个M * N的矩阵中,所有的元素只有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最大是指元素1的个数最多. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行是 ...

  2. 九度oj 题目1139:最大子矩阵

    题目描述: 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的矩阵 0 -2 -7 0 9 2 -6 2 -4 1 ...

  3. [Jobdu] 题目1361:翻转单词顺序

    题目描述: JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,“stu ...

  4. [Jobdu] 题目1373:整数中1出现的次数(从1到n整数中1出现的次数)

    题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他.问题是:求出1~13的整数中1出现的次数,并算出100~130 ...

  5. [Jobdu] 题目1377:缓变序列

    题目描述: 陈博在写论文时碰到一个难题:如何将给定的整数序列变换成缓变序列:即任意两个相邻的元素相差均为1,第1个元素和最后一个元素相差也为1. 变换是指改变原整数序列中各元素的顺序.例如整数序列1, ...

  6. [Jobdu] 题目1531:货币面值

    题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在游戏中购买各种装备来提升自己.有一天,他突然很想知道这些纸币的组合不能表示的最小面额是多少, ...

  7. [Jobdu] 题目1527:首尾相连数组的最大子数组和

    题目描述: 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相连的.数组中一个或多个连续元素可以组成一个子数组,其中存在这样的子数组arr[i],…arr ...

  8. [Jobdu] 题目1506:求1+2+3+...+n

    题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C).  输入: 输入可能包含多个测试样例. 对于每 ...

  9. [Jobdu] 题目1283:第一个只出现一次的字符

    题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字 ...

随机推荐

  1. .jar包文件的生成与运行

    首先你得线配置好你的JRE,否则下面的都不会有作用,还没有配置的,请百度上搜索一下如何配置.这里我就不多讲了. jar包是一个可执行的文件包,简单说jar包就是一个外包.Java 程序是由若干个 .c ...

  2. 使用 pm2-web 监控 pm2 服务运行状态

    pm2-web 是一款 pm2 服务状态监控程序,基于 web . 安装 $ npm install -g pm2-web 运行(默认是在8080端口) $ pm2-web 配置 pm2-web 将会 ...

  3. s:iterator巧妙控制跳出循环

    <s:set name="index" value="1" /> <s:iterator value="#detail.member ...

  4. iOS中 imageNamed方法 非常多图片占用大量内存问题

    当我们须要载入非常多图片(相冊)的时候我们通常会用[UIimage  imageNamed:imageName]; 实际上[UIimage  imageNamed:imageName]这种方法在图片使 ...

  5. 简单的内存缓存模块 - Smache

    介绍 [sm]art + c[ache] = smache Smache 是一个方便的内存缓存模块,可以通过一些简单缓存策略避免无限占用更多的内存,同时确保最常用最应该被缓存的对象被缓存. GitHu ...

  6. Hadoop Combiners

    In the last post and in the preceding one we saw how to write a MapReduce program for finding the to ...

  7. 错误Name node is in safe mode的解决方法 (转)

    原文链接:错误Name node is in safe mode的解决方法 将本地文件拷贝到hdfs上去,结果上错误:Name node is in safe mode 这是因为在分布式文件系统启动的 ...

  8. 用指令来构建IIS7

    工作上要部署iis7+net4.0环境,发现30多台机子都没有用装有IIS7镜像来安装,都必须自己手动. 作为程序猿,真要一台台装的话,就真对不起自己的职业.于是想到用bat来执行任务,找到了安装II ...

  9. iOS: 字体样式

    获取iOS内置所有的字体如下: NSArray *familyNames = [UIFont familyNames]; for( NSString *familyName in familyName ...

  10. java学习笔记3--类与对象的基础

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note3.html,转载请注明源地址. 1.面向对象的程序设计方法概述 面向对象的程序设计 与 ...