ACM 1050 To the Max http://acm.pku.cn/JudgeOnline/problem?id=1050

这里我重新整理了一下最大子矩阵的算法;

基本思路是将二维数组转化为一维数组,多次调用最大子段和函数,通过比较获得最大值;我画一个图吧;

每次将二维数组的每列和转为一维数组;调用一维数组最大最大子段和问题;用temp存储最大值就欧了!!!总之一句话:会最大字段和这个问题就很容易看懂!我也不多写了,代码贴一下:

#include <iostream>
using namespace std;
int array[105][105],n,s[105];
int maxSum(int n,int *a)
{
int sum=a[0],b=0;
for(int i=0;i!=n;++i)
{
   if (b>0) b+=a[i];
    else b=a[i];
   if(b>sum) sum=b;
}
return sum;
}

int solve()
{
int sum=-128,i,j,k,temp;
for(i=0;i!=n;++i)
{
   for(j=0;j!=n;++j) s[j]=0;
   for(j=i;j!=n;++j)
   {
    for(k=0;k!=n;++k) s[k]+=array[j][k];
    temp=maxSum(n,s);
    if(temp>sum) sum=temp; 
   }
}
return sum;
}

int main()
{
cin>>n;
for(int i=0; i!=n; ++i)
   for(int j=0; j!=n; ++j)
    cin>>array[i][j];
cout<<solve(); 
return 0;
}

posted on 2011-05-06 19:52  _Clarence  阅读(164)  评论(0编辑  收藏  举报

导航