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 这道题使用到的算法是:预处理+最大连续子串和 如果会做最大连续子串和,那么理解这题就相对简单一些, ...
随机推荐
- Akka源码分析-Cluster-DistributedData
上一篇博客我们研究了集群的分片源码,虽然akka的集群分片的初衷是用来解决actor分布的,但如果我们稍加改造就可以很轻松的开发出一个简单的分布式缓存系统,怎么做?哈哈很简单啊,实体actor的id就 ...
- Rabbitmq笔记一
几个基本概念 Producer 生产者,发送消息的一方,图中左侧的client. Consumer 消费者,接收消息的一方,图中后侧的client. Broker 消息中间件的服务节点,一般一个Rab ...
- cocos2d-x win7 部署
1. 安装 下载python https://www.python.org/downloads/release/python-279/ 2.从官网下载cocos2d-x http://www.co ...
- 在struct 中使用string,赋值会报错
struct中最好使用char来代替string,因为string的大小不是固定的
- es6数值扩展
1. 二进制和八进制表示法 从 ES5 开始,在严格模式之中,八进制就不再允许使用前缀0表示,ES6 进一步明确,要使用前缀0o表示. ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0 ...
- Unity笔记(3)自学第三天
学习记录: 脚本使用:
- TypeError: slice indices must be integers or None or have an __index__ method
由于除法/自动产生的类型是浮点型,因此出现上述错误,修正方法为,将/更改为// roi_gray_lwpCV = gray_lwpCV[y:y + h // 2, x:x + w] # 检出人脸区域后 ...
- Python 语言搭建SELENIUM测试环境,搭建过程记录。
第一步,安装Python: 第二步,安装SetupTools: 第三步,安装Pip: 第四步,安装selenium(for python) 第五步,新建第一个基于Firefox的测试用例 上述 只是步 ...
- Python安装笔记
1.教程
- JBoss4.2的启动方式-Jboss无法通过IP地址访问,只能用localhost访问
JBOSS版本:4.2.3GA症状:服务器无法通过IP地址去访问,只能用127.0.0.1或者localhost来访问. 开始怀疑是端口没有放开,用telnet ip 80 也不能连接,就一直怀疑端口 ...