链接:https://www.nowcoder.com/acm/contest/131/B
来源:牛客网

题目描述

矩阵 M 包含 R 行 C 列,第 i 行第 j 列的值为 Mi,j
请寻找一个子矩阵,使得这个子矩阵的和最大,且满足以下三个条件:
子矩阵的行数不能超过 X 行。
子矩阵的列数不能超过 Y 列。
子矩阵中 0 的个数不能超过 Z 个。
请输出满足以上条件的最大子矩阵和。

输入描述:

第一行输入五个整数 R,C,X,Y,Z。
接下来 N 行,每行输入 M 个整数,第 i 行第 j 列的整数表示 Mi,j
1 ≤ R,C ≤ 500.
1 ≤ X ≤ R.1 ≤ Y ≤ C.1 ≤ Z ≤ R x C.-10

≤  M

i,j  

≤ 10

9

输出描述:

输出满足以上条件的最大子矩阵和。
示例1

输入

复制

5 5 3 3 4
0 0 10 0 0
3 4 0 2 3
-1 3 0 -8 3
0 0 32 -9 3
3 0 45 3 0

输出

复制

82

示例2

输入

复制

2 2 2 2 2
-1 -1
-1 -1

输出

复制

0

题意 : 在一个大的矩阵中寻找一个小的矩阵,但是行列是有要求的。思路分析: 枚举行的起点和终点,复杂度是 O(n^2) , 通过预处理前缀和,可以得到此时的一行的数,再O(n)的用单调队列搞一下即可代码示例 : (WA 了 , 还在调试中 )
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn = 1e6+5;
typedef pair<ll, ll>pa;ll n, m;
ll x, y, z;
ll mp[505][505], sum[505][505], cnt[505][505], ze[505][505];
ll f[505], f2[505];
pa que[2005];int main() {//freopen("in.txt", "r", stdin);//freopen("out.txt", "w", stdout);cin >> n >> m >> x >> y >> z;for(ll i = 1; i <= n; i++){for(ll j = 1; j <= m; j++){scanf("%lld", &mp[i][j]);if (mp[i][j] == 0) ze[i][j] = 1;}}    for(ll i = 1; i <= n; i++){for(ll j = 1; j <= m; j++){cnt[i][j] = cnt[i-1][j]+ze[i][j];sum[i][j] = sum[i-1][j]+mp[i][j];}} ll ans = 0;for(ll i = 1; i <= n; i++){for(ll j = i; j <= n; j++){if (j-i+1 > x) break;ll l=0, r = 0 ;memset(que, 0, sizeof(que));memset(f, 0, sizeof(f));memset(f2, 0, sizeof(f2));for(ll k = 1; k <= m; k++){ll num = sum[j][k]-sum[i-1][k];ll zero = cnt[j][k]-cnt[i-1][k];f[k] = f[k-1]+num;                f2[k] = f2[k-1]+zero;while (l < r && que[r-1].first > f[k]){r--;}que[r++] = make_pair(f[k], k);while(l < r && k-que[l].second+1 > y) {l++; }while(l < r && f2[k]-f2[que[l].second-1] > z) {l++; }if (l< r) ans = max(ans, f[k]-f[que[l].second-1]);//prllf("%lld %lld %lld %lld  l = %lld r = %lld \n", i, j, k, ans, l, r);}}}printf("%lld\n", ans);return 0;
}

转载于:https://www.cnblogs.com/ccut-ry/p/9383955.html

带限制条件的最大子矩阵 - 牛客相关推荐

  1. 【2019牛客暑期多校训练营(第二场) - H】Second Large Rectangle(单调栈,全1子矩阵变形)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/H 来源:牛客网 题目描述 Given a N×MN \times MN×M binary matrix. ...

  2. 刷完牛客网910道Java题目,快速总结上万字,带你扫清Java基础面试障碍

    花时间刷完了牛客网专项训练所有的Java题,终于有点时间,决定肝一篇Java基础总结,带你扫清Java基础面试障碍! 文章目录 1.Java关键字 2.向上或向下转型 3.类初始化顺序 4.ASCII ...

  3. 手把手带你刷好题(牛客刷题⑤)

    作者:月亮嚼成星~ 博客主页:月亮嚼成星~的博客主页 专栏:手把手带你刷牛客 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客网 点击免费注册和我一起刷题吧 1.类中的数据域使 ...

  4. 带权二分图匹配(最小费用最大流) 8.2牛客暑期多校训练营五 E

    E.room | 时间限制:1 秒 | 内存限制:256M Nowcoder University has 4n students and n dormitories ( Four students ...

  5. 【牛客刷题】带你在牛客刷题第一弹(C/C++语言基础题)

    目录 第一题 你好,牛客 题目 讲解: AC: 第二题 牛牛学说话之-整数 题目 讲解: AC: 第三题 牛牛学说话之-浮点数 题目 讲解: AC: 第四题 牛牛学加法 题目 讲解: AC: 第五题  ...

  6. 带 sin, cos 的线段树 - 牛客

    链接:https://www.nowcoder.com/acm/contest/160/D 来源:牛客网 题目描述 给出一个长度为n的整数序列a1,a2,...,an,进行m次操作,操作分为两类. 操 ...

  7. 手把手带你学python—牛客网python 机器学习 信息熵的计算

    牛客是一款不论是面试 还是刷题 都是非常有用的 还等什么,传送门- 牛客网python基础

  8. 手把手带你学python—牛客网python基础 pandas读取文件查看用户数据集的大小

    牛客是一款不论是面试 还是刷题 都是非常有用的 还等什么,传送门- 牛客网python基础

  9. 手把手带你学python—牛客网python基础 鸢尾花分类

    牛客是一款不论是面试 还是刷题 都是非常有用的 还等什么,传送门- 牛客网python基础

最新文章

  1. discovery_01
  2. 可被三整除的最大和—leetcode1262
  3. windows XP系统下oracle完整卸载过程
  4. kubernetes集群使用GPU及安装kubeflow1.0.RC操作步骤
  5. 《大数据》2021年第2期目次摘要
  6. 数据结构-排序进阶代码
  7. 使用NBAR更有效的识别与封堵网络应用
  8. Activity 生命周期及其栈管理方式
  9. 目录-化工工艺设计手册-换热器
  10. r语言和python爬虫谁厉害_从事数据科学Python和R语言学哪个好?
  11. 开源终端上网行为管理服务器编译环境搭建
  12. ecshop手机号码归属地
  13. 重置微信内置浏览器字体大小
  14. android 3d车辆轨迹,极限汽车轨迹3D游戏
  15. aspose-slides-22.5-jdk16
  16. CAD关闭图层快捷键,隐藏显示的CAD图层
  17. c++倒序输出一个四位整数
  18. HorizontalScrollview+recycleview实现横向滑动
  19. 牛客练习赛51(C题 勾股定理)
  20. vite+vue3打包后图片404问题:已解决

热门文章

  1. Hyperledger Fabric Docker 文件路径权限
  2. 腾讯集团与光大集团签署战略合作 共建金融科技创新实验室
  3. delphi中关于时间差的实例
  4. 如何优化Spring Cloud微服务注册中心架构?
  5. [Android Pro] AndroidX重构和映射
  6. 在一个夜黑风高的夜晚,坐在教室里学多线程
  7. 鸡蛋该放在哪些篮子里?多少合适?
  8. 解决打包软链接打包失败问题
  9. MVC Razor:自定义Helper方法
  10. Win7碎片整理在哪?