当前位置: 首页 > news >正文

【SSL 1056】最大子矩阵 (多维DP)

题目大意

已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是 1 ∗ 1 1*1 11)子矩阵。
比如,如下 4 ∗ 4 4*4 44 子矩阵
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
的最大子矩阵是
9 2
-4 1
-1 8
这个子矩阵的大小是 15 15 15

输入格式

输入一个 N ∗ N N*N NN ( 1 < = N < = 500 ) (1<=N<=500) (1<=N<=500)的整数矩阵,每个数的范围在 − 127 -127 127~ 127 127 127 之间。

输出格式

输出最大子矩阵的大小。

输入样例

4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2

输出样例

15

基本思路

我们的第一想法肯定是暴力枚举,但即便用二维前缀和优化依然是 O ( n 4 ) O(n^4) O(n4) ,明显是承受不了的。我们观察数据规模可以发现 O ( n 3 ) O(n^3) O(n3) 是可以承受的,因为每个 f o r for for 循环不一定都是 n n n ,那么怎么优化呢?

首先我们可以枚举枚子矩阵的宽度,即它有多少列。然后我们在将这个子矩阵中每一行的数加起来看成一个数。
在这里插入图片描述
此时我们得到了一个从上到下有 n n n 个数的数列(因为我们只枚举了宽度,长度即行数则默认为 n n n)。接下来就要确定行数了,现在问题就转化为在这 n n n 个数中选取一段和最大的连续子序列。 在这个图中就是 11 , − 3 , 7 11, -3 , 7 11,3,7,由此确定的子矩阵为 { 9 , 2 } \{9,2\} {9,2} { − 4 , 1 } \{-4,1\} {4,1} { − 1 , 8 } \{-1,8\} {1,8} 了。

还有一个问题需要注意,因为存在负值情况,所以 a n s ans ans 要赋一个极小值。

核心代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=510;
int n,s[N][N],ans=-1e9;
int main(){ios::sync_with_stdio(false);cin>>n;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){cin>>s[i][j];s[i][j]+=s[i][j-1];}for(int d=0;d<n;d++){//枚举宽度 for(int i=1;i+d<=n;i++){int j=i+d,tmp=0;for(int k=1;k<=n;k++){tmp+=(s[k][j]-s[k][i-1]);//将此行的数看成一个数ans=max(ans,tmp);tmp=max(tmp,0); }}}cout<<ans;
//	2
//	-4 -2
//	-3 -1
//	
//	-1return 0;
}

相关文章:

  • 统计信号处理基础 习题解答11-8
  • C语言中宏定义控制日志输出及log库介绍
  • 在大型项目中,怎样有效地组织和管理 SCSS 文件结构以提高开发效率?
  • 米国政府呼吁抛弃 C 和 C++
  • 基于Lua源码开发动态库供lua脚本使用
  • 红黑树插入删除流程(流程图)
  • 记一次小程序渗透
  • 1982Springboot宠物美容院管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目
  • 网络安全筑基篇——反序列化漏洞
  • 二分查找及其变种
  • Visio框图自动带填充色原因及如何取消
  • Windows系统安装MySQL8.0.38
  • Linux 程序置顶脚本
  • 深入理解pytest fixture:提升测试的灵活性和可维护性!
  • 汉光联创HGLM2200N黑白激光多功能一体机加粉及常见问题处理
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【5+】跨webview多页面 触发事件(二)
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • canvas 五子棋游戏
  • centos安装java运行环境jdk+tomcat
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • css选择器
  • Docker 笔记(2):Dockerfile
  • in typeof instanceof ===这些运算符有什么作用
  • learning koa2.x
  • vue-router 实现分析
  • windows下如何用phpstorm同步测试服务器
  • 前端学习笔记之观察者模式
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #控制台大学课堂点名问题_课堂随机点名
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (多级缓存)多级缓存
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转载)从 Java 代码到 Java 堆
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .describe() python_Python-Win32com-Excel
  • .NET BackgroundWorker
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET DataGridView数据绑定说明
  • .net framework profiles /.net framework 配置
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .Net 基于MiniExcel的导入功能接口示例
  • .Net 应用中使用dot trace进行性能诊断
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • .NET面试题(二)