nyoj 104 最大和 (二维最大字串和)
描述
给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
例子:
- -
-
- -
- -
其最大子矩阵为: -
-
其元素总和为15。
- 输入
-
第一行输入一个整数n(<n<=),表示有n组测试数据;
每组测试数据:
第一行有两个的整数r,c(<r,c<=),r、c分别代表矩阵的行和列;
随后有r行,每行有c个整数; - 输出
-
输出矩阵的最大子矩阵的元素之和。
- 样例输入
-
- -
-
- -
- - - 样例输出
-
这个问题就是最大值子区间和的二维问题。
最大子区间和是说给你一个数组,然后让你找一个连续的子区间,让这个区间的数的和最大。很经典的简单DP。题目可以参考这个链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=44。
一维问题的解决思路是,max_sum表示从第一数到目前的最大和,sum是某段区间的和,如果sum<0,那么sum没有利用价值了,把sum=0,否则就继续往上加。
max_sum=max((sum+=a[i])<0?0:sum,max_sum);
二维的问题,其实可以转化为一位的问题。
首先我们要注意到二维子矩阵在选取的时候是个矩阵,联系一个我们经常会用到的技巧:但我们需要频繁计算一个数据任意一个区间
的和的时候,我们会预先把这个数组使用啊a[i]=a[i]+a[i-1]的方式把它记录的值变为数组到这个位置的和,这样的好处就是任意一个区间[i,j]的和就可转化为了a[i]-a[j-1]。
在这里我们依然采用这样的技巧。我们把这个矩阵记录的值对于每个列向量都做上述改变。
然后我们就发现,但我们选取任意的连续行进行组合的时候,这个行区间对于的列的值的和都可以用上述方法快速获得,那么对于每个列的和又会变为一个求一维连续区间最大和问题了。到此这个问题就可以以O(n^2)的复杂度解决了。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define N 106
#define inf 1<<26
int n,m;
int mp[N][N];
int main()
{
int t;
scanf("%d",&t);
while(t--){
memset(mp,,sizeof(mp));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
scanf("%d",&mp[i][j]);
mp[i][j]+=mp[i-][j];
}
} int MAX = -inf;
for(int i=;i<=n;i++){
for(int j=i;j<=n;j++){
int tmp = ;
for(int k=;k<=m;k++){
int cnt = mp[j][k]-mp[i-][k];
tmp+=cnt;
if(tmp>MAX) MAX = tmp;
if(tmp<) tmp=;
}
}
}
printf("%d\n",MAX); }
return ;
}
nyoj 104 最大和 (二维最大字串和)的更多相关文章
- nyoj 104——最大和——————【子矩阵最大和】
最大和 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个 ...
- NYOJ 104 最大和
最大和 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个 ...
- NYOJ 104 最大子矩阵(二维DP)
最大和 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描写叙述 给定一个由整数组成二维矩阵(r*c),如今须要找出它的一个子矩阵,使得这个子矩阵内的全部元素之和最大,并把这个 ...
- Java实验——输出二维数组连续二维子数组的最大和
该算法思路,根据我博客里面一维子数组求和的思路,可以用一个新的二维数组对该二维区域的数组进行求和,例如新的二维数组的第5个位置,就代表从1到5斜对角线的块状区域的和,即1,2,4,5这4个数的和,x个 ...
- HDU1559 最大子矩阵 (二维树状数组)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1559 最大子矩阵 Time Limit: 30000/10000 MS (Java/Others) ...
- [软件工程] 查找二维数组最大子数组的之和 郭莉莉&李亚文
一. 在主函数中实现二维数组的输入. 代码主要函数maxson(),主要利用for()循环先查找出最大字数组的四角的坐标xmin,xmax,ymin,ymax来确定最大子数组, 在循环中算出之和,编写 ...
- 使用jquery.qrcode生成二维码支持logo,和中文
/* utf.js - UTF-8 <=> UTF-16 convertion * * Copyright (C) 1999 Masanao Izumo <iz@onicos.co. ...
- IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)
问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10 分析: 2*2子数组的最大和.遍历求和,时 ...
- HDU 4819 Mosaic (二维线段树)
Mosaic Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total S ...
随机推荐
- JAVA并发实现四(守护线程和线程阻塞)
守护线程 Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程. 守护线程作用是为其他前台 ...
- poj 3134 Power Calculus(迭代加深dfs+强剪枝)
Description Starting with x and repeatedly multiplying by x, we can compute x31 with thirty multipli ...
- 一台机器同时运行多个appium实例
测试需要同时在多个android设备上运行,就需要启动多个appium 第一台是运行微信: DesiredCapabilities capabilities = new DesiredCapabili ...
- Android学习总结——强制下线功能(广播)
最近一口气买了好几本书,其中Android的<第一行代码>觉得真心不错,学到这个内容,顺便做个总结,加深印象. 强制下线的基本思想就是在界面上弹出一个对话框,让用户必须点击确定按钮跳转到登 ...
- PHP设计模式笔记七:观察者模式 -- Rango韩老师 http://www.imooc.com/learn/236
观察者模式 概述: 1.观察者模式(Observer),当一个对象状态发生改变时,依赖他的对象全部会收到通知,并自动更新 2.场景:一个事件发生后,要执行一连串更新操作,传统的编程方式,就是在事件的代 ...
- ORACLE SEQUENCE 介绍
在oracle中sequence就是所谓的序列号,每次取的时候它会自己主动添加,一般用在须要按序列号排序的地方. 1.Create Sequence 你首先要有CREATE SEQUENCE或者C ...
- 变量a的定义
1.一个整型数 int a; 2.一个指向整型数的指针 int *a; 3.一个指向指针的指针,它指向的指针是指向一个整形数 int **a; 4.一个有10个整型数的数组 ]; 5.一个有10个指针 ...
- mysqlbinlog详解
mysqlbinlog用于处理二进制日志文件的实用工具详解mysqlbinlog从二进制日志读取语句的工具.在二进制日志文件中包含的执行过的语句的日志可用来帮助从崩溃中恢复. binlog日志打开方法 ...
- excel 下载
public string CreateExcel(string SelectedBizType, string strReportDate, DropDownList ddlYQ, DropDown ...
- WCF入门教程系列四
一.概述 配置也是WCF编程中的主要组成部分.在 以往的.net应用程序中,我们会把DBConn和一些动态加载类及变量写在配置文件里.但WCF有所不同.他指定向客户端公开的服务,包括服务的地址. 服务 ...