[Jobdu] 题目1139:最大子矩阵
- 题目描述:
-
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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:最大子矩阵的更多相关文章
- [Jobdu] 题目1497:面积最大的全1子矩阵
题目描述: 在一个M * N的矩阵中,所有的元素只有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最大是指元素1的个数最多. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行是 ...
- 九度oj 题目1139:最大子矩阵
题目描述: 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的矩阵 0 -2 -7 0 9 2 -6 2 -4 1 ...
- [Jobdu] 题目1361:翻转单词顺序
题目描述: JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,“stu ...
- [Jobdu] 题目1373:整数中1出现的次数(从1到n整数中1出现的次数)
题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他.问题是:求出1~13的整数中1出现的次数,并算出100~130 ...
- [Jobdu] 题目1377:缓变序列
题目描述: 陈博在写论文时碰到一个难题:如何将给定的整数序列变换成缓变序列:即任意两个相邻的元素相差均为1,第1个元素和最后一个元素相差也为1. 变换是指改变原整数序列中各元素的顺序.例如整数序列1, ...
- [Jobdu] 题目1531:货币面值
题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在游戏中购买各种装备来提升自己.有一天,他突然很想知道这些纸币的组合不能表示的最小面额是多少, ...
- [Jobdu] 题目1527:首尾相连数组的最大子数组和
题目描述: 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相连的.数组中一个或多个连续元素可以组成一个子数组,其中存在这样的子数组arr[i],…arr ...
- [Jobdu] 题目1506:求1+2+3+...+n
题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 输入: 输入可能包含多个测试样例. 对于每 ...
- [Jobdu] 题目1283:第一个只出现一次的字符
题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字 ...
随机推荐
- 树状数组求第K小值 (spoj227 Ordering the Soldiers && hdu2852 KiKi's K-Number)
题目:http://www.spoj.com/problems/ORDERS/ and pid=2852">http://acm.hdu.edu.cn/showproblem.php? ...
- 打造android万能上拉下拉刷新框架——XRefreshView (二)
打造Android万能上拉下拉刷新框架--XRefreshView(一) 打造Android万能上拉下拉刷新框架--XRefreshView(三) 一.前言 自从上次发表了打造android万能上拉下 ...
- QT 5.3 VS2010 中文
#include <QtWidgets/QApplication> #include <QTextCodec>#include <QLabel>#pragma ex ...
- Mysql创建、删除用户、查询所有用户等教程,提升您的MYSQL安全度!
建议您不要使用mysql的root账号来为您的web页面连接数据库,这可能会导致用户通过网页获取到您的数据库账号密码,存在严重的安全隐患. 建议新建一账号,权限设置基本够用,然后使用那新建的账号来连接 ...
- OpenMeetings(4)----新用户注册
用户登录与注册的主要代码都在WebContent\src\base\auth\checkLoginData.lzx文件中 <simpleLabelButton labelid=" ...
- 算法笔记_129:计数排序(Java)
目录 1 问题描述 2 解决方案 2.1比较计数排序 2.2 分布计数排序 1 问题描述 给定一组数据,请使用计数排序,得到这组数据从小到大的排序序列. 2 解决方案 2.1比较计数排序 下面算法 ...
- vim 查找和替换命令 替换/n和\n
一. 字符串的查找 1. vim 中用 / 和 ? 来查找字符串,两者的区别是: /string 会高亮显示光标后匹配的第一个字符串,回车后光标移到该字符串的第一个字母: ?string 会高亮显示光 ...
- smartsvn9破解及license文件
第一步:去官网下载自己系统smartsvn版本文件 下载地址:http://www.smartsvn.com/download 第二步:破解 (1) 将文件解压到系统路径:/opt/smartsvn ...
- java线程-synchronized实现可见性代码
以下是一个普通线程代码: package com.Sychronized; public class SychronizedDemo { //共享变量 private boolean ready=fa ...
- Jsp+Servlet+JavaBean经典MVC模式理解
MVC模式目的(实现Web系统的职能分工). 在Java EE中,Jsp+Servlet+JavaBean算是里面经典的模式,是初学者必备的知识技能.M, Model(模型)实现系统的业务逻辑 1.通 ...