【贪心】最大子矩阵
【题目描述】
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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 N。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数...)给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[-127,127]。
【输出描述】
最大子矩阵的大小
【样例输入】
4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
【样例输出】
15
【题目分析与思路】
这道题的目的是找到最大非空子矩阵,最小的那个是1x1的矩阵。
可以用贪心,可以用动态规划
二维数组可以看出一维数组
【参考代码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;
}扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。


