信息学奥赛初赛天天练-87-NOIP2014普及组-完善程序-矩阵、子矩阵、最大子矩阵和、前缀和、打擂台求最大值

1 完善程序

最大子矩阵和

给出 m行 n列的整数矩阵,求最大的子矩阵和(子矩阵不能为空)。
输入第一行包含两个整数 m和 n,即矩阵的行数和列数。之后 m行,每行 n个整数,描述整个矩阵。程序最终输出最大的子矩阵和。
(最后一空 4 分,其余 3分,共 16 分)
比如在如下这个矩阵中:

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

拥有最大和的子矩阵为:

 9 2  
-4 1  
-1 8 

其和为 15

3  3  
-2 10  20 
-1 100 -2 0  -2 -3

最大子矩阵和为 128

4  4  0 -2 -9 -9 
-9 11  5  7 
-4 -3 -7 -6 
-1  7  7  5 

最大子矩阵和为 26

#include <iostream>
using namespace std;
const int SIZE = 100;
int matrix[SIZE + 1][SIZE + 1];
int rowsum[SIZE + 1][SIZE + 1]; /* rowsum[i][j]记录第i行前j个数的和 */
int m, n, i, j, first, last, area, ans;
int main()
{cin >> m >> n;for ( i = 1; i <= m; i++ )for ( j = 1; j <= n; j++ )cin >> matrix[i][j];ans = matrix   ①;for ( i = 1; i <= m; i++ )②;for ( i = 1; i <= m; i++ )for ( j = 1; j <= n; j++ )rowsum[i][j] = ③;for ( first = 1; first <= n; first++ )for ( last = first; last <= n; last++ ){④;for ( i = 1; i <= m; i++ ){area += ⑤;if ( area > ans )ans = area;if ( area < 0 )area = 0;}}cout << ans << endl;return(0);
}

1 ①处应填( )

2 ②处应填( )

3 ③处应填( )

4 ④处应填( )

5 ⑤处应填( )

2 相关知识点

1) 前缀和

前缀和(Prefix Sum)是一种常见的算法技巧,用于快速计算数组中某个区间内元素的和。它的基本思想是将数组元素依次累加,形成一个前缀和数组,通过前缀和数组可以快速计算任意区间的元素和

示例

输入一个长度为 n 的整数序列。

接下来再输入 m 个询问,每个询问输入一对 l,r。

对于每个询问,输出原序列中从第 l 个数到第 r 个数的和

第1行,分别为n,m

第2行,长度为n的序列

接下来m行,每行分别对应l和r

5 3
2 1 3 6 4
1 2
1 3
2 4

输出分析

1 2 输出3 -  2+1=3
1 3 输出6 -  2+1+3=6
2 4 输出10 - 1+3+6=10

源程序

#include <bits/stdc++.h>
using namespace std;const int N = 100010;
int a[N];//存放读入数据数组
int s[N];//前缀和数组int main() {int n,m;int l,r;scanf("%d %d",&n,&m);for(int i = 1;i<=n;i++){scanf("%d",&a[i]);s[i] += s[i-1] + a[i];//预处理前缀和}for(int i = 1;i<=m;i++){scanf("%d %d",&l,&r);printf("%d\n",s[r] - s[l-1]);//通过前缀和公式直接访问}system("pause");return 0;
}
/*
输入 
5 3
2 1 3 6 4
1 2
1 3
2 4
输出
3
6
10 
*/

2) 矩阵

矩阵(matrix)是数学中的一个矩形数组,由行和列构成,表示一组数值、变量或表达式。矩阵在多种学科中有广泛应用,包括线性代数、物理、计算机科学、统计学等

例如

假设有一个 3×3的矩阵

3) 子矩阵

在上面3×3的矩阵中,如果我们删除第 2 行和第 2 列,得到的子矩阵为

3 思路分析

1 计算每一行对应列的前缀和for ( i = 1; i <= m; i++ )for ( j = 1; j <= n; j++ )rowsum[i][j] = rowsum[i] [j-1]+matrix[i] [j];
2 遍历二维数组任意2列,锁定每一个子矩阵for ( first = 1; first <= n; first++ )for ( last = first; last <= n; last++ ){
3 计算每一个子矩阵的和,计算思路为
加入当前行,计算一个新的子矩阵,如果此矩阵之和大于0,则和之前最大矩阵打擂台
如果此矩阵之和小于0,则说明前面这些对后面无矩阵和无帮助,重新开始计算矩阵和for ( i = 1; i <= m; i++ ){area += rowsum[i] [last]-rowsum[i] [first-1];if ( area > ans )ans = area;if ( area < 0 )area = 0;}

1 ①处应填( [1] [1] )

分析

初始矩阵第一个数,这个数也是一个子矩阵,后续如果有更大的,可以通过打擂台的方式替换调

2 ②处应填( rowsum[i] [0]=0 )

分析

真实数据从第1列开始,每行的第0列初始为0,后续计算矩阵和时,可以通用使用前一列+当前列

3 ③处应填( rowsum[i] [j-1]+matrix[i] [j] )

分析

每行计算前缀和,rowsum[i][j]表示,第i行,前j列的和
rowsum[i][j]=rowsum[i] [j-1]+matrix[i] [j]
表示第i行,前j列的和=第i行,前j-1列的和+第1行,第1列的数

4 ④处应填( area=0 )

分析

通过下面双重循环,固定列后,计算这些列之间m行的最大子矩阵的和累加到area变量中
每增加一行,如果是正的数,和最终结果ans打擂台
如果是负数,下一行重新开始累加计算for ( first = 1; first <= n; first++ )for ( last = first; last <= n; last++ ){

5 ⑤处应填( rowsum[i] [last]-rowsum[i] [first-1] )

分析

根据前缀和,某一行从first到last之间和,可以通过当前行的last列-(first-1)获取,避免循环累加计算

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/419923.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言俄罗斯方块(VS2022版)

C语言俄罗斯方块 演示视频一、前置知识1.Win32 API 的使用2.宽字符的使用 二、封装核心数据与框架介绍三、核心操作介绍旋转操作检测操作水平检测竖直检测代码化简 四、源码展示在 tetris.h 中&#xff1a;在 tetris.c 中&#xff1a;在 test.c 中&#xff1a; 以下代码环境为 …

码上进阶_刷题模块测试_用例设计

码上进阶_刷题模块测试_用例设计 系统概述&#xff1a; 码上进阶是为程序员专门打造的交流平台&#xff0c;采用主流的微服务框架和C端技术栈作为技术基础。在这个平台上&#xff0c;程序员 可以通过刷题、练习和模拟面试来提升自己的面试能力。 功能测试&#xff1a; 登录…

SpringBoot OAuth2自定义登陆/授权页

背景 5 月份的时候&#xff0c;我实践并整理了一篇博客&#xff1a;SpringBoot搭建OAuth2&#xff0c;该博客完成之后&#xff0c;很长一段时间里我都有种意犹未尽的感觉。诚然&#xff0c;我把OAuth2搭起来了&#xff0c;各种场景的用例也跑通了&#xff0c;甚至源码也看了&am…

99.WEB渗透测试-信息收集-网络空间搜索引擎shodan(1)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;98.WEB渗透测试-信息收集-Google语法&#xff08;12&#xff09; 信息收集方向-网络空间…

【IDEA配置一个maven项目(详细操作流程)】

目录 一、安装Maven 1、官网下载maven链接地址&#xff1a;Maven – Download Apache Maven 2、下载完成后&#xff0c;解压到某一路径下。E:\JavaTools\apache-maven-3.9.8为例&#xff0c;实际配置环境变量时以自己安装的路径为准。 二、配置环境变量 1、右键此电脑–&g…

springboot、flowable 生成图片发布到Docker乱码问题

flowable自带的方法生成图片时&#xff0c;如设置字体为宋体&#xff0c;则本地测试没有问题&#xff0c;因为windows自带宋体字体库&#xff0c;但是如果发布到Docker&#xff0c;则会出现乱码问题&#xff0c;因为大部分Docker并不包含宋体字体库&#xff1b; 通过Java代码&a…

基于springboot+vue实现的在线商城系统

系统主要功能&#xff1a; &#xff08;1&#xff09;商品管理模块&#xff1a;实现了商品的基本信息录入、图片上传、状态管理等相关功能。 &#xff08;2&#xff09;商品分类模块&#xff1a;实现了分类的增删改查、分类层级管理、商品分类的关联等功能。 &#xff08;3&…

一个穷稳且病多的中年案例

调整 理性消费&#xff0c;量入为出 重视健康&#xff0c;提前规划 多元收入&#xff0c;提升自我 心态平和&#xff0c;知足常乐 提示&#xff1a;最后悔买“方”。 “方”和“車”对现金流的影响非常大。 全都是大额消耗性支出。 保持健康也需要物质基础。 为何收入或…

深度学习应用 - 自然语言处理(NLP)篇

序言 在信息技术的浩瀚星空中&#xff0c;深度学习犹如一颗璀璨的新星&#xff0c;正引领着人工智能领域的深刻变革。作为这一领域的核心分支&#xff0c;自然语言处理&#xff08; NLP \text{NLP} NLP&#xff09;更是借助深度学习的力量&#xff0c;实现了前所未有的飞跃。自…

BookStack在线文档管理系统本地Docker部署与远程访问详细教程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

电池的电-热-寿命模型是什么?

一、背景 电池的电-热-寿命模型在工程领域具有重要意义&#xff0c;它是一种描述电池性能、温度与使用寿命之间相互关系的复杂模型。具体工程意义体现在以下几个方面&#xff1a; 性能预测&#xff1a; 通过电-热-寿命模型&#xff0c;工程师可以预测在不同负载条件下电池的…

基于YOLOv8的PCB缺陷检测算法,加入一种基于内容引导注意力(CGA)的混合融合方案(一)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文内容&#xff1a;针对基于YOLOv8的PCB缺陷检测算法进行性能提升&#xff0c;加入各个创新点做验证性试验。 1&#xff09;提出了一种基于内容引导注意力(CGA)的混合融合方案&#xff0c;mAP0.5由原始的0.966提升至0.975 1.PCB缺陷…

【数据结构】排序算法篇二

【数据结构】排序算法篇二 1. 快速排序&#xff08;hoare版本&#xff09;&#xff08;1&#xff09;基本思想&#xff1a;&#xff08;2&#xff09;动态图解&#xff1a;&#xff08;3&#xff09;代码实现&#xff1a;&#xff08;4&#xff09;特性总结&#xff1a; 2. 快速…

Spring Boot属性注入的多种方式!

Spring Boot的一个问题&#xff0c;证明你是不是真正的 "会用" Spring boot ?Spring Boot的一个问题&#xff0c;直接暴露你是不是真正使用Spring Boothttps://mp.weixin.qq.com/s?__bizMzkzMTY0Mjc0Ng&mid2247484040&idx1&sn64ad15d95e44c874cc890973…

uboot源码分析uboot启动流程,uboot-CMD命令调用关系

uboot的最终目的是引导启动内核加载系统&#xff0c;根据这个线索我们可以首先找到uboot引导内核的main函数&#xff0c;查看系统引导的执行跳转的函数 main_loop。 下面对uboot函数的调用关系和主要调用函数进行分析。 一、uboot函数调用关系梳理 函数调用如下&#xff1a; …

Oracle Linux 8.10安装Oracle19c(19.3.0)完整教程

安装前请仔细将文档通读一遍&#xff0c;安装过程中根据安装命令仔细核对&#xff0c;特别留意一些字体加粗或标红的字样&#xff0c;遇到问题请及时咨询公司 1、基础环境 1.1、操作系统 cat /etc/redhat-release 1.2、主机名 医院默认分配的主机名可能跟其他主机会有重复&a…

Idea配置 阿里云 Spring Initializr URL

Idea默认Strart services url Idea中默认使用为https://start.spring.io/&#xff0c;国内网络如果不稳定创建工程会很慢修改为阿里云地址 https://start.aliyun.com/

局域网文件分发如何实现?掌握这4个秘籍,文件一键分发破次元!

局域网文件分发是许多企业和组织在日常工作中常见的需求&#xff0c; 有效的文件分发可以显著提高工作效率。 以下是四种实现局域网文件一键分发的秘籍&#xff1a; 1.使用终端监控软件的文件分发功能 软件示例&#xff1a;安企神等。 步骤简述&#xff1a; 安装软件&…

IP学习——oneday

1.什么是网络&#xff1f;为什么需要网络&#xff1f; 空间&#xff0c;时间&#xff1b;传统的邮件传输要考虑到距离&#xff0c;网络解决了空间距离&#xff08;太远&#xff09;、解决了时间问题&#xff08;旧音乐等&#xff09; 云:面向客户的虚拟化服务 运营商公司主营…

麒麟信安重庆渠道伙伴行业研讨会,共探国产化发展机遇

9月5日下午&#xff0c;麒麟信安举办重庆渠道伙伴行业研讨会。研讨会旨在探讨国产化浪潮下操作系统相关产业的发展机遇与挑战&#xff0c;以及如何在各关键领域实现市场拓展与应用&#xff0c;共商合作、共创未来。 会议伊始&#xff0c;麒麟信安详细阐述了公司以国产自主操作系…