【DP】ssl 1205.最大子矩阵之和

题目描述

给出一个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,输出15。

思路

DP,枚举开始结尾两列+前缀和+最大子序列问题。

a[k][j]-a[k][i-1]==第k行第i-j的数的和


代码

#include<cstdio>
int n,i,j,k,s,ans,a[101][101]={0};
int main(){
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	  for(j=1;j<=n;j++){
	  	scanf("%d",&a[i][j]);
	  	a[i][j]=a[i][j]+a[i][j-1]; //求前缀和
	  }
	ans=-1000000;    //emmmmmm,不解释
	for(i=1;i<=n;i++)
	  for(j=i;j<=n;j++){   //枚举开始和结尾两列
	  	s=0;     
	  	for(k=1;k<=n;k++){       //以第k行开始到n求最大子序列
	  		if(s+(a[k][j]-a[k][i-1])>0) //加上是否大于0(如果小于的话那不是不如不加?
			s=s+a[k][j]-a[k][i-1]; //加上这一行i-j之间的数的和
			else s=0; //不加,清零
			if(s>ans) ans=s;
	  	}  
	  }
	printf("%d",ans);
}

猜你喜欢

转载自blog.csdn.net/qq_42937087/article/details/82949404