您的位置:首页 > 其它

hdu1081-最大子矩阵和(zoj-1074)

2013-07-28 16:37 239 查看
杭电链接:http://acm.hdu.edu.cn/showproblem.php?pid=1081

浙大链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1074

题意就是给你一个矩阵,找出一个子矩阵,这个子矩阵中所有的数的和是所有可能得到的子矩阵中的最大值,输出这个值。

思路就是和最大连续子序列一样,只不过用行压缩,把几行加和看成一行,变成最大子序列。具体方法是用一个二维数组a[i][j],表示这是第j列前i行的和得到所有数据和,然后开始遍历,用3个for循环,一行一行的找(这里的一行表示的是前几行的和),然后一列一列的加,最终就能得到最大和。结合代码看。

AC代码:

#include<stdio.h>
#include<string.h>
#define maxn 105
int main()
{
int a[maxn][maxn];
int n,t;
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
scanf("%d",&t);
a[i][j]=a[i-1][j]+t;
}
}
int sum;
int m=0;
for(int i=1; i<=n; i++)
{
for(int j=i; j<=n; j++)
{
sum=0;
for(int k=1; k<=n; k++)
{
t=a[j][k]-a[i-1][k];
sum+=t;
if(sum<0)sum=0;
if(sum>m)m=sum;
}
}
}
printf("%d\n",m);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: