动规-最大子矩阵

Posted H_Cisco

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动规-最大子矩阵相关的知识,希望对你有一定的参考价值。

描述

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

比如,如下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。

输入

输入是一个N * N的矩阵。输入的第一行给出N (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

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int a[105][105],b[105],i,j,k,n;
long long maxx,s;
int main()
{
	cin>>n;
	for(i=1;i<=n;i++)
	for(j=1;j<=n;j++)
	  scanf("%d",&a[i][j]);
	  maxx=a[1][1];
	for(i=1;i<=n;i++)
	{
		memset(b,0,sizeof(b));
		for(j=i;j<=n;j++)
		{
			for(k=1;k<=n;k++)
			  b[k]+=a[j][k];
			s=0;
			for(k=1;k<=n;k++)
			{
				if(s<0)s=0;
				s+=b[k];
				if(s>maxx)maxx=s;
			}
		}
	}
	cout<<maxx;
	return 0;
}

 

以上是关于动规-最大子矩阵的主要内容,如果未能解决你的问题,请参考以下文章

HDU4328 Cut the cake(动规:最大子矩形问题/悬线法)

动规-HDU-2859

LeetCode 1034. 边界着色 / 689. 三个无重叠子数组的最大和(三个区间的滑动窗口,带回溯求具体值的动规) / 794. 有效的井字游戏

最大公共子序列(动规)

动规讲解基础讲解四——最大子段和问题

线性动规最大子段和