求长方体的最大子长方体,该如何处理

求长方体的最大子长方体
对一个M*N*K的长方体,每个单元格中对应一个整型值,求这个长方体的最大子长方体(元素的和最大,假设不会超过整型范围)
求解题思路。。

------解决方案--------------------
C/C++ code


#include <iostream>
using namespace std;

class Max_Rectangle
{
    friend istream& operator >>(istream &,Max_Rectangle&);//重载输入运算符
    friend ostream& operator <<(ostream &,const Max_Rectangle&);//重载输出运算符
    friend void in_out_sum(Max_Rectangle&);//给main()提供一个方法

private:
    int rec_cost[51][51][51]; //存储长方体每个格子的cost
    int mar_cost[51][51]; //存储长方体向下面投影的cost和
    int line_cost[51];//存储直线型子段和cost值
    int max_cost; //存储最大子矩阵和
    int _m,_n,_p ;//长方体的长,宽,高
    int max_sum_line(int len);//直线最大子段和
    int max_sum_mar(int len,int wid);//矩阵最大子段和

public:
    inline Max_Rectangle(int m=0,int n=0,int p=0);//构造函数
    void max_sum_rec();//长方体最子段和
};

void in_out_sum(Max_Rectangle &rec)
{
    while(true)
    {
        cin>>rec;
        rec.max_sum_rec();
        cout<<rec;
    }
}

istream& operator >> (istream &is, Max_Rectangle &rec)
{
    cout<<"输入m,n,p:";
    is>>rec._m>>rec._n>>rec._p;
    rec.max_cost=-200000;
    cout<<"输入长方体的cost: - -...:"<<endl;
    for(int i=1;i<=rec._m;++i)
    {
        for(int j=1;j<=rec._n;++j)
        {
            for(int k=1;k<=rec._p;++k)
            {
                cout<<"输入("<<i<<","<<j<<","<<k<<")的cost:";
                cin>>rec.rec_cost[i][j][k];
            }
        }
    }
    return is;
}

ostream& operator <<(ostream &os,const Max_Rectangle &rec)
{
    os<<"最大子长方体的cost:"<<rec.max_cost<<endl;
    return os;
}

inline Max_Rectangle::Max_Rectangle(int m, int n, int p):_m(m),_n(n),_p(p),max_cost(-200000){}

int Max_Rectangle::max_sum_line(int len)
{
    int sum=-2000000,b=0;
    for(int i=1;i<=len;++i)
    {
        b=b>0 ? b+line_cost[len]: line_cost[len];
        if(b>sum)
        {
            sum=b;
        }
    }
    return sum;    
}

int Max_Rectangle::max_sum_mar(int len,int wid)
{
    int sum=-2000000;
    int max=0;
    for(int i=1;i<=wid;++i)
    {
        for(int k=1;k<=len;++k)
        {
            line_cost[k]=0;
        }
        for(int j=i;j<=wid;++j)
        {
            for(int f=1;f<=len;++f)
            {
                line_cost[f]+=mar_cost[f][j];
            }
            max=max_sum_line(len);
            if(max>sum)
            {
                sum=max;
            }
        }
    }
    return sum;
}

void Max_Rectangle::max_sum_rec()//_m,_n,_p
{
    int max=0;
    int sum=-200000;
    for(int i=1;i<=_p;++i)
    {
        for(int j=1;j<=_m;++j)
        {
            for(int k=1;k<=_n;++k)
            {
                mar_cost[j][k]=0;
            }
        }
        for(int j=i;j<=_p;++j)
        {
            for(int k=1;k<=_m;++k)
            {
                for(int f=1;f<=_n;++f)
                {
                    mar_cost[k][f]+=rec_cost[k][f][j];
                }
            }
            max=max_sum_mar(_m,_n);
            if(max>sum)
            {
                sum=max;
            }
        }
    }
    max_cost=sum;
}

int main()
{
    Max_Rectangle test;
    in_out_sum(test);
    return 0;
}