最大子矩阵【DP】

> Description
给出一个N [2<=N<=100],并给出一个N*N的矩阵,矩阵中的数为[-127,127]之间。求出矩阵中一块子矩阵的最大和。

比如:

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

和最大的子矩阵应该是这个:

9 2
-4 1
-1 8

它的和是15。


> Input


> Output


> Sample Input
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-18 0 -2


> Sample Output
15


> 解题思路
这一题用到计算前缀和和动态规划


> 代码

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=101;
int ca,a,len[maxn][maxn],n,ans;

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=n;j++)
	 {
	 	scanf("%d",&a);
	 	len[i][j]=len[i-1][j]+a;
	 	//len计算列向的前缀和
	 }
	for(int i=1;i<=n;i++)
	 for(int j=i;j<=n;j++)
	 //枚举某一行到某一行
	 {
	 	int sum=0;
	 	for(int k=1;k<=n;k++)
	 	{
	 		ca=len[j][k]-len[i-1][k];
	 		//“压缩”i行到j行的前缀和
	 		sum+=ca;//累加
	 		if(sum<0) sum=0;//如果为负数就清零
	 		if(ans<sum) ans=sum;
	 	}
	 }
	printf("%d",ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43010386/article/details/82948878