求长方体的最大子长方体,该如何处理
求长方体的最大子长方体
对一个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; }