POJ1050

求矩阵中和最大的块(把前两行前三行二三行。。。相加后,利用求最大子串和的思想,然后比较找到最大的那个块即可)

#include <iostream>

using namespace std;

int longest(int a[],int n)
{
    int max,sum;
    max=sum=0;
    for(int i=0;i<n;i++)
    {
        sum+=a[i];
        if(sum>0)
        {
            if(sum>max)
            max=sum;
        }
        else
            sum=0;
    }
    return max;
}

int main()
{
    int n,max,sig,x,i,j,m,k;
    int a[130][130],temp[130];
    while(cin>>n)
    {
    max=0;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            cin>>a[i][j];
        }
    }
    sig=0;
    for(i=n;i>0;i--)
    {
        for(int j=0;j<i;j++)
        {
            for(m=0;m<n;m++)
            {
                temp[m]=a[j][m];
            }
            x=j+1;
            for(k=0;k<sig;k++)
            {
                for(m=0;m<n;m++)
                    temp[m]+=a[x][m];
                x++;
            }
            if(max<longest(temp,n))
            {
                max=longest(temp,n);
            }
        }
        sig++;
    }
    cout<<max<<endl;
    }
    return 0;
}

posted @ 2013-03-22 09:55  algorithms爱好者  阅读(235)  评论(0)    收藏  举报