当前位置:首页 > 算法 > 正文内容

【贪心】最大子矩阵

亿万年的星光4年前 (2021-02-19)算法19738

【题目描述】

已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1X1)子矩阵。

比如,如下4 x 4的矩阵

0    -2    -7    0

9    2    -6    2

-4    1    4    1

-1    8    0    -2

的最大子矩阵是

9    2

-4    1

-1    8

这个子矩阵的大小是15。

【输入描述】

输入是一个N x NN(0<N<=100)。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数...)给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[-127,127]。


【输出描述】

最大子矩阵的大小

【样例输入】

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

【样例输出】

15

【题目分析与思路

  1. 这道题的目的是找到最大非空子矩阵,最小的那个是1x1的矩阵。

  2. 可以用贪心,可以用动态规划

  3. 二维数组可以看出一维数组



【参考代码1】

#include<iostream>
#include<cstring>
using namespace std;
 
int search(int n,int a[])//求一维数组连续子列和
{
	int sum=0,max=0;
	for(int i=0;i<n;i++)
	{
		if(sum>0)
			sum+=a[i];  //大于0才累加 
		else
			sum=a[i];  //小于0保持 
		if(sum>max)
			max=sum;
	}
	return max;
}
 
int main()
{
	int n,a[100][100],temp[100];
	int maxc=0,max=0;
	cin>>n;
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			cin>>a[i][j];
	for(int i=0;i<n;i++)//记录矩阵开始的行号
	{
		memset(temp,0,sizeof(temp));
		for(int j=i;j<n;j++)//记录矩阵结束的行号
		{
			for(int k=0;k<n;k++)
				temp[k]+=a[j][k]; 
			maxc=search(n,temp);    //每次传入一个数组 
			if(maxc>max)
				max=maxc; 
		}
	}
	cout<<max<<endl;
	return 0;
}






扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

标签: 贪心
分享给朋友:

相关文章

【算法】单调栈

一、单调栈单调栈(Monotonic Stack)是一种特殊的栈结构,其核心思想是维护栈内元素的单调性(单调递增或单调递减)。单调栈通常用于解决与元素大小关系相关的问题,例如:找到数组中每个元素的下一...

【算法】动态规划(二)——数字三角形问题

【算法】动态规划(二)——数字三角形问题

1.问题描述及状态定义数字三角形问题:有一个非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数字的坐下方和右下方各有一个数。如下图所示:从第一行开的数开始走,每次可以往下或右走一格,直到走到...

【算法】最短路径算法——Floyed-Warshell算法

【算法】最短路径算法——Floyed-Warshell算法

如下图所示,我们把边带有权值的图称为带权图。边的权值可以理解为两点之间的距离。一张图中任意两点间会有不同的路径相怜。最短路径就是指连接两点的这些路径中最短的一条。【注意】边的权值可以为负。当出现负边权...

【算法】广度优先搜索算法(BFS)

【算法】广度优先搜索算法(BFS)

一、广度优先搜索的过程    广度优先搜索算法(又称宽度优先搜索算法,BFS)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra...

【排序】----选择排序

【排序】----选择排序

1.基本思想每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列最前,直到全部待排序的数据排完。2.过程首先初始化最小元素索引值为首元素。依次遍历待排序数列,遇到小于该最小索引...

【贪心】区间覆盖

【贪心】区间覆盖

【题目描述】给定一个长度为m的区间,再给出n条线段的起点和终点(本题考虑闭区间),求最少使用多少线段可以将整个区间完全覆盖。【输入】第一行是区间长度m。第二行是n,表示有n个可选区间。后面跟着n行数据...