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

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

时间:2024-09-09 18:36:44浏览次数:1  
标签:打擂台 前缀 area int rowsum 矩阵 初赛 处应

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)获取,避免循环累加计算

标签:打擂台,前缀,area,int,rowsum,矩阵,初赛,处应
From: https://www.cnblogs.com/myeln/p/18405075

相关文章

  • 短视频seo矩阵源码---MVC框架开发技术分享
    一.短视频矩阵源码数据库建立1.用户表(user):-用户ID(user_id)-用户名(username)-密码(password)-手机号(phone)-邮箱(email)2.账号表(account):二. MVC框架开发技术分享MVC(模型-视图-控制器)是一种常见的软件架构模式,用于将应用程序的不同部分分离开来,以实现更好的可维护性和......
  • 短视频矩阵系统源码----SaaS化技术开发方案
    一.短视频矩阵系统介绍短视频矩阵系统是一种用来管理和展示短视频的系统。它可以帮助用户快速浏览和观看大量的短视频内容,提供了多种功能和工具来帮助用户管理和优化短视频的播放体验。1.账号管理(覆盖抖音、快手、B站、视频号等平台)企业可将多平台多个账号进行统一授权管......
  • 《动手学深度学习》笔记3——矩阵求导
    李沐老师的讲解思路是先从数学概念引入,讲完以后再到代码实现:1.数学概念1.1标量导数1.2向量求导(梯度)分为四种情况:1.2.1标量y,关于向量x求导李沐老师这里先讲了y为标量,x为向量的情况,x是长度为1的列向量,关于列向量的导数(即梯度)是行向量,具体解释如下:在这个例子里, ......
  • 向量与矩阵几何关系
    目录一、基向量二、向量与基向量三、向量张成的空间四、矩阵与线性变换五、矩阵乘法与线性变换复合一、基向量基向量(basisvectors)是构成向量空间的一组基本元素,它们满足以下条件:线性无关:基中的向量之间不能通过线性组合相互表示。这意味着没有一个向量可以表示为......
  • 信息学奥赛初赛天天练-86-NOIP2014普及组-基础题5-球盒问题、枚举算法、单源最短路、D
    1NOIP2014普及组基础题521把M个同样的球放到N个同样的袋子里,允许有的袋子空着不放,问共有多少种不同的放置方法?(用K表示)()例如,M=7,N=3时,K=8;在这里认为(5,1,1)和(1,5,1)是同一种放置方法。问:M=8,N=5时,K=()22如图所示,图中每条边上的数字表示该边的长度,则从......
  • 无向图的拉普拉斯矩阵
    Definition定义无权重的无向图G=(V,E)。V是顶点集合,E是边集合。根据G,可得到一系列定义:adjacencymatrix(邻接矩阵) ......
  • 信息学奥赛初赛天天练-86-NOIP2014普及组-基础题5-球盒问题、枚举算法、单源最短路、D
    信息学奥赛初赛天天练-86-NOIP2014普及组-基础题5-球盒问题、枚举算法、单源最短路、Dijkstra算法、Bellman-Ford算法PDF文档公众号回复关键字:202409081NOIP2014普及组基础题521把M个同样的球放到N个同样的袋子里,允许有的袋子空着不放,问共有多少种不同的放置方法?(......
  • python科学计算:NumPy 线性代数与矩阵操作
    1NumPy中的矩阵与数组在NumPy中,矩阵实际上是一种特殊的二维数组,因此几乎所有数组的操作都可以应用到矩阵上。不过,矩阵运算与一般的数组运算存在一定的区别,尤其是在点积、乘法等操作中。1.1创建矩阵矩阵可以通过NumPy的array()函数创建。矩阵的形状可以通过shap......
  • 抖音短视频矩阵系统-----技术开发框架分析
    开发前言:抖音短视频矩阵系统技术开发框架主要用到VUE,SpringBoot、Django等,本技术文档使用于#短视频矩阵源码开发部署 #抖音矩阵源码开发 #抖音矩阵源码  #抖音矩阵开发抖音短视频矩阵系统的技术开发框架可以采用如下分析:前端开发框架:抖音短视频矩阵系统的前端......
  • 信息学奥赛初赛天天练-85-NOIP2014普及组-基础题4-链表、随机存取、顺序存取、二分查
    信息学奥赛初赛天天练-85-NOIP2014普及组-基础题4-链表、随机存取、顺序存取、二分查找、二分比较、循环结构、图领奖PDF文档公众号回复关键字:202409071NOIP2014普及组基础题49下列选项中不属于图像格式的是()AJPEG格式BTXT格式CGIF格式DPNG格式1......