【HihoCoder - 1502】最大子矩阵(二维前缀和,尺取)
题干:
给定一个NxM的矩阵A和一个整数K,小Hi希望你能求出其中最大(元素数目最多)的子矩阵,并且该子矩阵中所有元素的和不超过K。
Input
第一行包含三个整数N、M和K。
以下N行每行包含M个整数,表示A。
对于40%的数据,1 <= N, M <= 10
对于100%的数据,1 <= N, M <= 250 1 <= K <= 2147483647 1 <= Aij <= 10000
Output
满足条件最大的子矩阵所包含的元素数目。如果没有子矩阵满足条件,输出-1。
Sample Input
3 3 9 1 2 3 2 3 4 3 4 5
Sample Output
4
解题报告:
先预处理一个前缀和,然后枚举每两行,然后行内尺取就行了,总复杂度N^3,。可以尺取的前提是元素都是正数。
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define F first
#define S second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
int n,m,k;
ll a[255][255],sum[255][255];
int main()
{cin>>n>>m>>k;for(int i = 1; i<=n; i++) {for(int j = 1; j<=m; j++) {scanf("%lld",&a[i][j]);}}for(int i = 1; i<=n; i++) {for(int j = 1; j<=m; j++) {sum[i][j] = a[i][j] + sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1]; }}int ans = -1;for(int i = 1; i<=n; i++) {for(int j = i; j<=n; j++) {int l = 1,r = 1;ll tmp = 0;while(r <= m) {tmp += sum[j][r] - sum[j][r-1] - sum[i-1][r] + sum[i-1][r-1];while(l<=r && tmp > k) {tmp -= sum[j][l] - sum[j][l-1] - sum[i-1][l] + sum[i-1][l-1];l++;}if(tmp <= k)ans = max(ans,(j-i+1)*(r-l+1)); r++;}}}if(ans <= 0) printf("-1\n");else printf("%d\n",ans);return 0 ;
}
【HihoCoder - 1502】最大子矩阵(二维前缀和,尺取)相关推荐
- 【HDU - 1937 】Finding Seats(二维前缀和+尺取法)
题干: A group of K friends is going to see a movie. However, they are too late to get good tickets, so ...
- 海啸(二维前缀和/二维树状数组)
链接:https://ac.nowcoder.com/acm/problem/21862 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 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 ...
- Gym 102091L Largest Allowed Area 【二分+二维前缀和】
<题目链接> 题目大意: 给你一个由01组成的矩形,现在问你,该矩形中,最多只含一个1的正方形的边长最长是多少. 解题分析: 用二维前缀和维护一下矩形的01值,便于后面直接$O(1)$查询 ...
- AcWing 99. 激光炸弹 (二维前缀和)
99. 激光炸弹 题意 给定一个5000x5000的地图 随机在该地图上放置物品,物品具有价值,且不同物品可以放置在同一位置 有一个炸弹的爆炸范围为RxR的正方形 问该炸弹在地图上爆炸一次,最多能摧毁 ...
- 模版 ----- 一维前缀和与二维前缀和
一维前缀和 795. 前缀和 a[i] 的前 i 项和 s[i] 的递推公式:s[i]=s[i−1]+a[i]s[i] = s[i - 1] + a[i]s[i]=s[i−1]+a[i] 求出在 [l ...
- 一维前缀和,二维前缀和,一维差分,二维差分(翻译)
练习一道题目 输入一个长度为n的整数序列. 接下来再输入m个询问,每个询问输入一对l, r. 对于每个询问,输出原序列中从第l个数到第r个数的和. 输入格式 第一行包含两个整数n和m. 第二行包含n个 ...
- 激光导弹Gundam Unicorn(二维前缀和and二维差分)
激光炸弹和Gundam Unicorn是二维前缀和和二位差分的综合应用. 首先是一二维差分,前缀和的模板前缀和与差分 图文并茂 超级详细整理(全网最通俗易懂)_林深不见鹿 的博客-CSDN博客_前缀和 ...
- 【二维前缀和】304. 二维区域和检索 - 矩阵不可变
目录 题目 前缀和解法(二维) 二维vector 定义 这道题是「303. 区域和检索 - 数组不可变」的进阶,第 303 题是在一维数组中做区域和检索,这道题是在二维矩阵中做区域和检索. 题目 30 ...
- [蓝桥杯 2018 国 B] 搭积木 (区间dp + 二维前缀和优化)
原题链接(洛谷) 题目描述 小明对搭积木非常感兴趣.他的积木都是同样大小的正立方体. 在搭积木时,小明选取 m m m 块积木作为地基,将他们在桌子上一字排开,中间不留空隙,并称其为第 0 0 0 层 ...
最新文章
- etcd 笔记(09)— 基于 etcd 实现微服务的注册与发现
- 在ASP.NET中UrlRewrite的实现(能隐藏扩展名)之一
- 强制转换const 引用
- 使用代码获得Hybris Commerce里显示的产品图片
- oracle滚动统计,sql – 按月滚动或运行Oracle总计
- PHP求100-1000之间的水仙花数
- 残差自回归模型的R实现
- oracle sql列转行_Oracle行转列、列转行的Sql语句总结(转)
- Spring系列8:bean的作用域
- 华为交换机常见VLAN操作
- 文件服务器和ftp服务器的区别
- 深富策略鸿蒙概念股继续领跌
- win中q-dir,everything,Windows Tabs,Clover各种效率神器(搜索,资源管理器,多标签)
- linux7 清屏,CentOS 清屏命令clear的讲解
- 代码审计--13--源代码审计思路(下)
- 单片机原理及应用之AT89S52
- 高效团队都在用的目标管理工具——飞项
- NX二次开发-UFUN工程图导入视图UF_DRAW_import_view
- 哔哩哔哩怎么调节屏幕亮度
- day06 记账程序01
热门文章
- oracle.cmd
- android学习笔记:数据库存储
- 673. Number of Longest Increasing Subsequence
- [Leedcode][JAVA][第200题][岛屿数量][DFS][BFS][并查集]
- eclipse maven项目 class类部署不到tomcat下_Servlet tomcat部署
- python列表统计每个元素出现次数_python 统计list中各个元素出现的次数的几种方法...
- 手工机器人的做法大全用易拉罐_纯手工自制黄油,做法简单详细易操作,蛋糕、饼干、面包都能用...
- delphi 中如果不进行 closehandle 会怎么样_心理学:当你迷茫了,请坚持做三件事,你的未来会越来越好...
- ubuntu安装python_ubuntu18.04下源码编译安装最新版本Python3
- java如何添加进程_如何创建一个进程,如何进程调用进程