SCAU OJ题 8601 最大长方体问题

时间限制:1000MS 内存限制:1000K 提交次数:0 通过次数:0
语言: not limited
描述
一个长,宽,高分别是m,n,p的长方体被分割成mnp个小立方体。每个小立方体内含一个整数。试着设计一个算法,计算所给长方体的最大子长方体。子长方体的大小由它内部所含所有整数之和确定。 约定:当该长方体所有元素均为负数时,输出最大子长方体为0。
输入格式
第一行3个正整数m,n,p,其中 1<=m,n,p<=50 接下来的m*n行中每行p个整数,表示小立方体中的数。
输出格式
第一行中的数是计算出的最大子长方体的大小。
输入样例
3 3 3 0 -1 2 1 2 2 1 1 -2 -2 -1 -1 -3 3 -2 -2 -3 1 -2 3 3 0 1 3 2 1 -3
输出样例
14
21

思路:先写出一维的最大子段和算法,基于一维算法写出最大子矩阵和的算法,再基于二维的算法写出三维的最大长方体和的算法,老俄罗斯套娃了。

#include 


using namespace std;
int maxsum(int n,int *a){
    int sum=0,b=0;
    for (int i = 1; i <=n ; i++) {
        if(b>0)
            b += a[i];
        else
            b = a[i];
        if(b>sum)//记录最大值
            sum=b;
    }
    return sum;
}
int maxsum2(int m,int n, int **a){
    int sum=0;
    int *b=new int [n+1];
    for (int i = 1; i <=m ; i++) {
        for (int k = 1; k <=n ; k++)
            b[k]=0;//置0
        for (int j = i; j <=m ; j++) {//动规思想,将m分成1~i和i+1~m两段
            for (int k = 1; k <=n ; k++)
                b[k] += a[j][k];
            int max=maxsum(n,b);
            if(max>sum)
                sum=max;
        }
    }
    return sum;
}
int maxsum3(int m,int n,int p,int ***a){
    int sum=0;
    int **c=new int*[n+1];
    for (int i = 1; i <=n ; i++) {
        c[i]=new int [p+1];
    }
    for (int i = 1; i <=m ; i++) {
        for (int j = 1; j <=n ; j++) {
            for (int k = 1; k <=p ; k++) {
                c[j][k]=0;//置0
            }
        }
        for (int l = i; l <=m ; l++) {//和二维的思想一样
            for (int j = 1; j <=n ; j++) {
                for (int k = 1; k <=p ; k++) {
                    c[j][k]+=a[l][j][k];
                }
            }
            int max=maxsum2(n,p,c);
            if(max>sum)
                sum=max;
        }
    }
    return sum;
}
int main(){
    int m,n,p,***a;
    cin>>m>>n>>p;
    a=new int**[m+1];//一维
    for (int i = 1; i <=m ; i++) {
        a[i]=new int*[n+1];
    }//二维
    for (int i = 1; i <=m ; i++) {
        for (int j = 1; j <=n ; j++) {
            a[i][j]=new int[p+1];
        }
    }//三维

    for (int i = 1; i <=m ; i++) {
        for (int j = 1; j <=n ; j++) {
            for (int k = 1; k <=p ; k++) {
                cin>>a[i][j][k];
            }
        }
    }
    cout<<maxsum3(m,n,p,a);
}

你可能感兴趣的:(#,动态规划,算法)