青少年编程知识记录 codecoming

【贪心】最大子矩阵

【题目描述】

已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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;  }










(adsbygoogle = window.adsbygoogle || []).push({});

标签: 贪心

作者:亿万年的星光 分类:算法 浏览: