HDU 1081 DP找最大和的矩阵
题目大意:
在一个给定的大矩阵中找一个小型的矩阵,使这个矩阵中的元素和最大
可以先来看下面这个问题:
原来有做过在一个给定的数字序列中找一个最大和子序列,核心代码如下:
int _max = num[];
int sum = num[];
int st = ;
int la = ;
int rec;
for(int i = ; i<k ; i++){
if(sum < ){
rec = i;//记录起点
sum = ;
}
sum += num[i];
if(sum > _max){
_max = sum;
st = rec;
la = i;
}
}
当然如果只是求最大值,可以不用st , la,这是用来记录找到的序列的端点位置的
明显这个问题和找最大和矩阵有着共通点,这个找子序列可以看作是一维的,而找矩阵,矩阵上的点也是相互紧连的,那也就是可以看作是在二维的平面上找
这里需要把一维的转化为二维的是关键
我们可以假定把每一行看作单个的元素,知道每个元素的值,那我们就能够将n列,看作有n个这样的压缩元素,那我们就是在这n个元素中找最大值
(当然压缩列也是可以的,这里我的代码写的是压缩行)
我们需要找到所有情况,因为所求矩阵不一定端点就在大矩阵的两端,也可以是中间,这里N <= 100 , N表示边, 那么上面的点至少有101个 , 所以我们
至少需要对每一行有101*101个这样的压缩情况,另外我们需要知道每一行压缩101*101种情况后的值那么至少要101*101*100的空间来保存
显然不太合理,当然我本人没试过,按理觉得也不会MLE
那么我们转化成用二维的sum[i][j]保存,表示第i行前j个数的和
那么比如我们得到第k行压缩第5个点和第99个点中间得到的大小为94的矩阵长度为一个元素
那么它的值就为 sum[k][99] - sum[k][5]
压缩好后就是简单的在线性时间内解决最大和子序列的问题了
#include <cstdio>
#include <cstring> using namespace std;
const int N = ;
int num[N][N] , sum[N][N]; int main()
{
// freopen("a.in" , "r" , stdin);
int n , maxn;
while(~scanf("%d" , &n)){
memset(sum , , sizeof(sum)); for(int i = ; i<n ; i++)
for(int j = ; j<n ; j++){
scanf("%d" , &num[i][j]);
sum[i][j+] = num[i][j] + sum[i][j];
} maxn = ;
for(int i = ; i<=n ; i++)
for(int j = ; j<i ; j++)
{
int suma = ;
for(int k = ; k<n ; k++)//从第i行不断往下在i到j列找到某一段矩阵得到最大值
{
if(suma<)
suma = ; suma += (sum[k][i] - sum[k][j]);
if(suma > maxn)
maxn = suma;
}
} printf("%d\n" , maxn);
}
return ;
}
HDU 1081 DP找最大和的矩阵的更多相关文章
- hdu  1081  dp问题:最大子矩阵和
		题目链接 题意:给你一个n*n矩阵,求这个矩阵的最大子矩阵和 #include<iostream> #include<cstdio> #include<string.h& ... 
- HDU 1081 To The Max【dp,思维】
		HDU 1081 题意:给定二维矩阵,求数组的子矩阵的元素和最大是多少. 题解:这个相当于求最大连续子序列和的加强版,把一维变成了二维. 先看看一维怎么办的: int getsum() { ; int ... 
- hdu 1081 To The Max(dp+化二维为一维)
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1081 To The Max Time Limit: 2000/1000 MS (Java/Others ... 
- hdu 1081 To The Max(二维压缩的最大连续序列)(最大矩阵和)
		Problem Description Given a two-dimensional array of positive and negative integers, a sub-rectangle ... 
- hdu 3016 dp+线段树
		Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ... 
- HDU 5928 DP 凸包graham
		给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ... 
- [FJOI2007]轮状病毒 题解(dp(找规律)+高精度)
		[FJOI2007]轮状病毒 题解(dp(找规律)+高精度) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1335733 没什么好说的,直接把规律找出来,有 ... 
- hdu 2604 Queuing  dp找规律  然后矩阵快速幂。坑!!
		http://acm.hdu.edu.cn/showproblem.php?pid=2604 这题居然O(9 * L)的dp过不了,TLE, 更重要的是找出规律后,O(n)递推也过不了,TLE,一定 ... 
- (DP)To The Max --HDU -- 1081
		链接: http://acm.hdu.edu.cn/showproblem.php?pid=1081 这道题使用到的算法是:预处理+最大连续子串和 如果会做最大连续子串和,那么理解这题就相对简单一些, ... 
随机推荐
- 如何彻底卸载Vs2015
			当我们卸载了VS2015想再安装VS软件的时候,发现安装路径根本更改不了. 网上查的由很多方法. 要真的找注册表去完全删除时非常繁琐的这里可以使用的方法就是 先下载卸载软件 https://githu ... 
- bzoj3450 Easy(概率期望dp)
			3450: Tyvj1952 Easy Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 876 Solved: 648[Submit][Status] ... 
- P2570 [ZJOI2010]贪吃的老鼠
			传送门 →_→唯一一篇能看得懂的题解---->这里 很容易想到二分+网络流,然而并没有什么卵用--出题人的思路太神了-- 首先考虑如果一块奶酪在同一时间可以被多只老鼠吃的话,该如何建图.首先不难 ... 
- Linux环境下修改MySQL数据库对表名大小写不敏感
			Linux系统中MySQL对数据库名称和表名是大小写敏感的,这就导致了一些麻烦,虽然已经建立了表和数据,但因为大小写导致无法找到表. MySQL数据库对表名大小写不敏感的设置方法如下: 1.查看MyS ... 
- CDH搭建Hadoop分布式服务器集群(java新手小白)
			1首先对于一个java还白的小白,先理解CDH与Hadoop的关系 一.Hadoop版本选择. Hadoop大致可分为Apache Hadoop和第三方发行第三方发行版Hadoop,考虑到Hadoop ... 
- Elasticsearch--预匹配器
			当你对一个无限输入数据流进行操作并搜索特定事件的出现时,可以使用此模型.可以用于检测监控系统中的故障. 在新版本中的知识点位置https://www.elastic.co/guide/en/elast ... 
- 安装ipython notebook及基本命令(快捷键)
			转载自:http://121.42.47.99/yuenshome/wordpress/?p=2622 目前基本上是Pycharm和ipython notebook结合起来做东西,ipython no ... 
- 两年,VMware又重回巅峰?
			两年前,被公有云和容器打的焦头烂额的VMware一度被众多业界人士看衰,营收.股价双双下滑.然而,仅仅经过短短两年时间,VMware已经和AWS,IBM.微软.Rackspace等众多公有云厂商成为合 ... 
- C++(Typedef声明)
			typedef 声明: 使用 typedef 为一个已有的类型取一个新的名字.下面是使用 typedef 定义一个新类型的语法: typedef type newname; 例如,下面的语句会告诉编译 ... 
- 通过重写.htaccess文件添加404
			如果说是用linux服务器的系统 想要给自己的网站设置404怎么弄?如果你不会给自己的Ecs服务器添加服务器管理系统,或是你购买的云虚拟主机没有304.404设置,那么就要通过自己重写文件来设置404 ... 
