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

news2024/11/13 18:14:48

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.coloradmin.cn/o/2118959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP中mmpv自动过账—附带源码

想省事儿的直接拖到后面查看代码 思路分析 实现逻辑:初版 前台测试:选择屏幕确认公司代码。必要情况手动开账勾选前台执行按钮 1.1去marv表找公司代码的当前账期,简单运算获取下一个账期。1.2执行bdc,模拟前台手动开账期1.3执行的必要信息存日志表。例:修改人(开账期的人…

FastAPI 进阶:使用 BackgroundTasks 处理长时间运行的任务

在 FastAPI 中&#xff0c;BackgroundTasks 是一个功能&#xff0c;它允许你在发送响应给客户端之后执行后台任务。这些任务对于不需要客户端等待的操作非常有用&#xff0c;比如发送电子邮件通知或处理数据。然而&#xff0c;当服务器重启时&#xff0c;由于 BackgroundTasks …

C++: set与map容器的介绍与使用

本文索引 前言1. 二叉搜索树1.1 概念1.2 二叉搜索树操作1.2.1 查找与插入1.2.2 删除1.2.3 二叉搜索树实现代码 2. 树形结构的关联式容器2.1 set的介绍与使用2.1.1 set的构造函数2.1.2 set的迭代器2.1.3 set的容量2.1.4 set的修改操作 2.2 map的介绍与使用2.2.1 map的构造函数2.…

基于python的mediapipe姿态识别 动作识别 人体关健点 实现跳绳状态判别 计数功能

基于Python的MediaPipe姿态识别实现跳绳状态判别与计数功能 项目概述 本项目旨在利用Google的MediaPipe库&#xff0c;结合姿态识别技术&#xff0c;实现对跳绳动作的实时检测与计数功能。通过识别人体关键点&#xff0c;系统能够准确判断跳绳动作的状态&#xff0c;并实时统…

Java入门:07.Java中的面向对象03

11 this关键字 this关键字有两个作用 第一个作用&#xff0c;用来调用重载的构造方法 public class Test3{public static void main(String[] args){new User();new User("ls");new User("ls","女");} } ​ class User{String name ;String sex…

Autosar工程师必读:ETAS工具链自动化实战指南<三>

----自动化不仅是一种技术&#xff0c;更是一种思维方式&#xff0c;它将帮助我们在快节奏的工作环境中保持领先&#xff01; 目录 往期推荐 自动化命令--generate 命令语法 参数说明 命令使用前提 场景1&#xff1a;BSW代码生成 场景2&#xff1a;RTE代码生成 场景3&a…

对非洲33国免关税!非洲市场不容错过

2024年9月5日中非合作论坛峰会在北京隆重召开&#xff0c;会议后宣布对非洲33个国家实行0关税的优惠政策&#xff0c;并且在未来三年&#xff0c;推动中国企业对非投资不少于700亿元人民币。 自然而然的&#xff0c;中非友好关系必然会带动中国对非洲市场的出口&#xff0c;近…

云计算实训44——K8S及pod相关介绍

一、K8S基本概念 1、k8s是什么 K8S是Kubernetes的 缩写&#xff0c;由于k 和 s 之间有⼋个字符&#xff0c;所以因此得名。 Kubernetes 是⼀个可移植的、可扩展的开源平台&#xff0c;⽤于管理容器化 的⼯作负载和服务&#xff0c;可促进声 明式配置和⾃动化。 2、k8s的功能…

STM32F1+HAL库+FreeTOTS学习10——任务相关API函数使用

STM32F1HAL库FreeTOTS学习10——任务相关API函数使用 任务相关API函数1. uxTaskPriorityGet()2. vTaskPrioritySet()3. uxTaskGetNumberOfTasks()4. uxTaskGetSystemState()5. vTaskGetInfo()6. xTaskGetCurrentHandle()7. xTaskGetHandle()8. xTaskGetIdleTaskHandle()9. uxTa…

你需要掌握的算法:快慢指针

文章目录 前言龟兔赛跑乌龟能否追上兔子乌龟与兔子在何处相遇龟兔问题的推论 快慢指针基础概念发展历史 快慢指针的应用检测链表是否有环找到链表的中间节点计算链表的环长度找到链表环的入口节点 小结 前言 在处理链表数据结构时&#xff0c;快慢指针是一种非常高效的算法技巧…

鸡尾酒排序算法

目录 引言 一、概念 二、算法思想 三、图例解释 1.采用冒泡排序&#xff1a; 2.采用鸡尾酒排序&#xff1a; 3.对比总结 四、算法实现 1.代码实现 2.运行结果 3.代码解释 五、总结 引言 鸡尾酒排序&#xff08;Cocktail Sort&#xff09;&#xff0c;也被称为双向冒…

同一天!蚂蚁集团宣布将发布3款AI新产品!腾讯、零一万物、面壁智能推出最新大模型|AI日报

文章推荐 缓解父母焦虑&#xff01;详细实测&#xff01;这些免费AI可以成为孩子提高学习能力的得力助手&#xff01; 附送试听地址&#xff01;OpenAI ChatGPT被曝将新增8种语音&#xff01;英特尔酷睿Ultra 200V正式发布&#xff5c;AI日报 今日热点 蚂蚁将发布三款AI新产…

Zynq7020 SDK 初学篇(4)- PL 端 GPIO

1.开发背景 基于 PS 端 GPIO 的基础上&#xff0c;如何调用 PL 端 GPIO 的输入输出 2.开发需求 PL 端按键控制 PL 端 LED 3.开发环境 Zynq7020 Vivado2017.4 4.实现步骤 4.1 设计配置 这里设置 PIO 数量 3 个 由于 PL 端不像 PS 端一样绑定 GPIO&#xff0c;所以需要对上面…

内容营销服务,照亮您的独特优势,助力业务增长

内容营销公司通常会承诺过高但交付不足&#xff0c;而在Digital Commerce Partners&#xff0c;我们走的是相反的方向。我们会调低&#xff08;然后超越&#xff09;预期。 由于我们是Copyblogger的SEO和内容营销代理商&#xff0c;我们知道伟大的事情需要时间——这意味着吸引…

【最新华为OD机试E卷-支持在线评测】通过软盘拷贝文件(200分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试E卷,全、新、准,题目覆盖率达 95% 以上,支持…

人工智能安全治理框架导图

资源链接&#xff1a;《人工智能安全治理框架》1.0版发布_中央网络安全和信息化委员会办公室

【Python机器学习】循环神经网络(RNN)——循环网络的记忆功能

文档中的词很少是完全独立的&#xff0c;它们的出现会影响文档中的其他词或者收到文档中其他词的影响&#xff1a; The stolen car sped into the arena. The clown car sped into the arena. 这两句话可能会产生两种完全不同的情感感受。这两个句子的形容词、名词、动词、介词…

算法入门-深度优先搜索2

第六部分&#xff1a;深度优先搜索 104.二叉树的最大深度&#xff08;简单&#xff09; 题目&#xff1a;给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;ro…

Tomcat配置及Servlet相关

目录 Eclipse配置Tomcat 1.配置服务器运行环境 2.新建服务器 3.新建动态Web项目 4.创建类继承HttpServlet 5.启动服务器 6.测试访问 请求转发与重定向 请求转发 重定向 Servlet的作用域 Servlet生命周期 这里以Eclipse为例&#xff0c;IDEA配置参考&#xff1a;IDE…

若依框架使用MyBatis-Plus中的baseMapper的方法报错Invalid bound statement (not found):

Invalid bound statement (not found): com.ruoyi.system.mapper.hc.HcOrderMapper.selectList 解决方法 MybatisSqlSessionFactoryBean sessionFactory new MybatisSqlSessionFactoryBean(); 使用 MybatisSqlSessionFactoryBean 而非 SqlSessionFactoryBean 的原因 MyBatis-…