链接:http://acm.hdu.edu.cn/showproblem.php?pid=1081
题意:求最大子矩阵和
想办法转换成一维的数列用最大子串和来解决,每次获取第 i 行到第 j 行之间每一列的和保存成一个数列,再最大子串求解
#include<stdio.h>
#include<string.h>
int map[105][105];
int a[105];
int n;
void getsub(int s,int e)
{
int i,j,sum;
for(i=0;i<n;i++)
{
sum=0;
for(j=s;j<=e;j++)
sum+=map[j][i];
a[i]=sum;
}
}
int main()
{
int i,j,k;
while(scanf("%d",&n)!=EOF)
{
int ans=-100000000;
for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&map[i][j]);
for(i=0;i<n;i++)
for(j=i;j<n;j++)
{
getsub(i,j);
int sum=0;
for(k=0;k<n;k++)
{
sum+=a[k];
if(sum>ans)
ans=sum;
if(sum<0)
sum=0;
}
}
printf("%d\n",ans);
}
return 0;
}
本文介绍了一种将二维矩阵问题转化为一维最大子串和问题的方法,通过遍历每行并计算每列的和,形成一维数组,然后使用最大子串和算法求解每个区间内的最大和。
466

被折叠的 条评论
为什么被折叠?



