#include <stdio.h>
#include <stdlib.h>
#define MAX 110
int MaxSubMerticx(int *a,int N) //一维最大序列和问题
{
int max,dp[MAX],i;
max=a[0];
dp[0]=a[0];
for(i=1;i<N;i++)
{
dp[i]=(dp[i-1]+a[i])>a[i]?(dp[i-1]+a[i]):a[i]; //最长子序列
if(dp[i]>max)
max=dp[i];
}
return max;
}
int main()
{
//
int N,metricx[MAX][MAX],dp[MAX],sum,max;
int i,j,k;
while(scanf("%d",&N)!=EOF)
{
for(i=0;i<N;i++)
for(j=0;j<N;j++)
scanf("%d",&metricx[i][j]);
max=metricx[0][0];
for(i=0;i<N;i++) //从第i行开始向下,依次枚举所有可能的矩阵
{
for(j=0;j<N;j++) //保存从第i行到第j行的列和,相当于纵向压缩,将矩阵列压缩为一个点,从而将最大子矩阵(二维,纵向+横向)转换为最大序列和(一维,纵向一定,横向最大),达到降维的目的
dp[j]=0;
for(j=i;j<N;j++)
{
for(k=0;k<N;k++) //计算到达j行为止的每一列的和
dp[k]+=metricx[j][k];
sum=MaxSubMerticx(dp,N); //求出在纵向为从i到j行,横向为0-N的最大横向方向子序列
if(sum>max)
max=sum; //更新全局最优解
}
}
printf("%d\n",max);
}
return 0;
}
/**************************************************************
Problem: 1139
User: cust123
Language: C++
Result: Accepted
Time:50 ms
Memory:1020 kb
****************************************************************/
题目1139:最大子矩阵
最新推荐文章于 2022-05-01 00:41:35 发布