动态规划之二维前缀和

题目

给你一个m×n的整数矩阵,在上面找一个x×y的子矩阵,使子矩阵中所有元素的和最大。

输入

输入数据的第一行为一个正整数T,表示有T组测试数据。每一组测试数据的第一行为四个正整数m,n,x,y(0<m,n<1000 AND 0<x<=m AND 0<y<=n),表示给定的矩形有m行n列。接下来这个矩阵,有m行,每行有n个不大于1000的正整数。

输出

对于每组数据,输出一个整数,表示子矩阵的最大和。

样例输入

1

4 5 2 2

3 361 649 676 588

992 762 156 993 169

662 34 638 89 543

525 165 254 809 280

样例输出

2474

题解

首先想到要用二维前缀和预处理这个矩形,dp[i][j]代表左上角为(1,1)右下角为(i,j)这个矩形的和。

那么怎么遍历这个矩形呢?我选择是从(x,y)这个地方开始遍历,一直遍历到右下角结束位置,寻找其中的最大值。

至于dp数组怎么来的呢?二维前缀和怎么求呢?这篇博客将会给你答案:

!!!->非常易懂的二维前缀和博客

AC代码:

#include <iostream>
#include <cstdio>
#define maxn 1005
using namespace std;
//@start: 2020-04-01 18:18:24 int mp[maxn][maxn];//保存矩形
int dp[maxn][maxn];//dp二维前缀和数组 //快速输入
inline void read(int &x){
int ch = getchar(); x = 0;
bool f = false;
while((ch < '0' || ch > '9') && ch != '-') ch = getchar();
if(ch == '-'){f = true; ch = getchar();}
while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0'; ch = getchar();}
if(f) x = -x;
} int main()
{
int t,m,n,x,y;
read(t);
while(t--)
{
read(m),read(n),read(x),read(y);
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
read(mp[i][j]);
//预处理,二位前缀和
dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+mp[i][j];
}
}
//遍历矩形
int x1,y1,tmp,mx=-99999;
for(int i=x;i<=m;i++){
for(int j=y;j<=n;j++){
x1=i-x+1;y1=j-y+1;
tmp=dp[i][j]-dp[i][y1-1]-dp[x1-1][j]+dp[x1-1][y1-1];
// cout<<i<<","<<j<<":"<<tmp<<endl;
if(tmp>mx)mx=tmp;
}
}
cout<<mx<<endl;
}
return 0;
}

【HDU】1559 最大子矩阵 (二维前缀和,动态规划)的更多相关文章

  1. openjudge1768 最大子矩阵[二维前缀和or递推|DP]

    总时间限制:  1000ms 内存限制:  65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的 ...

  2. HDU 6336.Problem E. Matrix from Arrays-子矩阵求和+规律+二维前缀和 (2018 Multi-University Training Contest 4 1005)

    6336.Problem E. Matrix from Arrays 不想解释了,直接官方题解: 队友写了博客,我是水的他的代码 ------>HDU 6336 子矩阵求和 至于为什么是4倍的, ...

  3. HDU - 6336 Problem E. Matrix from Arrays (规律+二维前缀和)

    题意: for (int i = 0; ; ++i) { for (int j = 0; j <= i; ++j) { M[j][i - j] = A[cursor]; cursor = (cu ...

  4. HDU 1559 最大子矩阵 (DP)

    题目地址:pid=1559">HDU 1559 构造二维前缀和矩阵.即矩阵上的点a[i][j]表示左上方的点为(0,0),右下方的点为(i,j)的矩阵的和.然后枚举每一个矩阵的左上方的 ...

  5. 2018 Multi-University Training Contest 4 Problem E. Matrix from Arrays 【打表+二维前缀和】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6336 Problem E. Matrix from Arrays Time Limit: 4000/20 ...

  6. Gym 102091L Largest Allowed Area 【二分+二维前缀和】

    <题目链接> 题目大意:给你一个由01组成的矩形,现在问你,该矩形中,最多只含一个1的正方形的边长最长是多少. 解题分析: 用二维前缀和维护一下矩形的01值,便于后面直接$O(1)$查询任 ...

  7. Memento Mori (二维前缀和 + 枚举剪枝)

    枚举指的是枚举矩阵的上下界,然后根据p0, p1, p2的关系去找出另外的中间2个点.然后需要记忆化一些地方防止重复减少时间复杂度.这应该是最关键的一步优化时间,指的就是代码中to数组.然后就是子矩阵 ...

  8. HDU-6514 Monitor(二维前缀和+差分)

    http://acm.hdu.edu.cn/showproblem.php?pid=6514 Problem Description Xiaoteng has a large area of land ...

  9. 洛谷P1719 最大加权矩形 (DP/二维前缀和)

    题目描述也没啥好说的,就是给你个你n*n的矩形(带权),求其中最大权值的子矩阵. 首先比较好想的就是二维前缀和,n<=120,所以可以用暴力. 1 #include<bits/stdc++ ...

  10. COGS1752 [BOI2007]摩基亚Mokia(CDQ分治 + 二维前缀和 + 线段树)

    题目这么说的: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它 ...

随机推荐

  1. ARP欺骗工具-arpspoof

    arpspoof arpspoof是dsniff下的一个ARP欺骗工具 大概原理: 两台主机HostA 和 HostB想要进行通信的流程,那么主机A将需要知道自己的ip,mac 以及主机B的ip, m ...

  2. msfvenom的使用

    msfvenom也只metasploit中的一个很强的工具,msfvenom生成木马非常的迅速可以各种版本的木马 该工具由msfpaylod和msfencodes的组成 生成木马是需要在本地监听,等待 ...

  3. day01-2-依赖管理和自动配置

    依赖管理和自动配置 1.依赖管理 1.1什么是依赖管理 spring-boot-starter-parent 中还有父项目,声明了开发中常用的依赖的版本号 并且进行自动版本仲裁,即如果程序员没有指定某 ...

  4. 推荐一套轻量级的开源图床系统:Light Fast Picture

    如果您跟我一样平时有些博客的习惯,那么图片存储是否有困扰过你呢?今天就给大家推荐一款不错的开源图床系统:Light Fast Picture 它是一个基于koa + vue3.x + typescri ...

  5. RBAC学习(一)

    0.前提 :用户只有一个直属部门,但角色可以关联多个部门 有一种情况就不太适用:比如说地区经理是一个角色,张三是北京市地区经理,他在组织架构中的直属部门是华北大区,然后一个黑龙江的销售李四提一个折扣申 ...

  6. 创业团队如何落地敏捷测试,提升质量效能?丨声网开发者创业讲堂 Vol.03

    前言 老牛是资深测试专家.技术架构师.具备多年互联网公司从业经验以及十多年一线研发经验.同时也是 DevOps 践行者,近几年兼任质量团队的管理工作.其中,负责的某技术平台,稳定运行两年多,累计调用量 ...

  7. CZHA0黑客游戏

    一个自己开发的黑客游戏,里面用到了自研AC库 A0阶段: from ac import* from time import * from sys import * def printf(text): ...

  8. Vue2模版编译(AST、Optimize 、Render)

    在Vue $mount过程中,我们需要把模版编译成render函数,整体实现可以分为三部分: parse:解析模版 template生成 AST语法树 optimize: 优化 AST语法树,标记静态 ...

  9. [Linux]常用命令之【hostname】

    1: 个人的片面理解: hostname是主机名(的"昵称"),而非域名.一般设置hostname,来标识当前机器的主要用途.以区别与其它机器 2: hostname的严格定义: ...

  10. RxJava--create源码分析

    使用示例: Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe( ...