POJ 1050

POJ ACM第1050题的详细描述,请参照
http://acm.pku.edu.cn/JudgeOnline/problem?id=1050

题目意思:
给定包含有正负整型的二维数组,找出所有子矩阵的和的最大值。
如二维数组
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
中和最大的子矩阵是
9 2
-4 1
-1 8
且最大和是15.

输入:
第一行是二维数组维数,其余多行是二维数组的元素,且数组由空格和空行分割。

输出:
子矩阵最大和。

实现原理:穷举行,然后转换为一维数组进行求解,代码如下:
#include<stdio.h>
//calculate the max sum of sub array of one-dimensional array
int max(int *b,int n)
{
    int sum=0,max=0,i=1;
    while(i<=n)
    {
       if(sum<0)
           sum=b[i];
       else
           sum+=b[i];
       if(max<sum)
           max=sum;
       i++;
    }
    return max;
}
//main method
int main()
{

    int a[][];//输入二维数组
    int num[101];//转换为一维之后
    int t[101][101];//[b]t[i][j]代表第j列前i行元素之和[/b]
    int Max=0,i,j,n,p,q,tempmax,rowcount,m;

    //输入二维数组,参见另一篇文章
    
    //calculate the sum of rows before i
    for(i=0;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(i==0)
                t[i][j]=0;
            else
            {
                int temp=0;
                for(m=1;m<=i;m++)
                    temp+=a[m][j];
                t[i][j]=temp;
            }
        }
    }
    //穷举行,然后转换为一维数组求解
    rowcount=1;//每次选取rowcount行
    while(rowcount<=n)
    {
        for(p=1;p<=n-rowcount+1;p++)
        {
            //[b]从第m行到第n行的和等于t[n][j]-t[m-1][j][/b]
            for(q=1;q<=n;q++)
                num[q]=t[p+rowcount-1][q]-t[p-1][q];
            tempmax=max(num,n);
            if(Max<tempmax)
                Max=tempmax;
        }
        rowcount++;
    }
    printf("%d\n",Max);
}

你可能感兴趣的:(二维数组,子矩阵,最大和)