欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

POJ 1050

程序员文章站 2022-05-01 09:39:59
...
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);
}