首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

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

2012-02-24 
求长方体的最大子长方体对一个M*N*K的长方体,每个单元格中对应一个整型值,求这个长方体的最大子长方体(元

求长方体的最大子长方体
对一个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;} 

热点排行