最大子长方体问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计与分析
课程设计
题目:最大子长方体问题
专业:网络工程
班级:
学号:
姓名:
计算机工程系
2012年11 月16 日
一、算法问题描述
一个立方体被分割成n个小立方体,每个小立方体内有一个整数。试设计一个算法,计算出所给立方体的最大子长方体。子长方体的大小由它所含所有整数之和确定。
二、算法问题形式化表示
三、期望输入与输出
输入:输入的第1行是3个正整数m,n,p,1≤m,n,p≤50。接下来m*n行每行p个正整数,表示小立方体中的数。
输出:输出的第1行中的数是计算出的最大子长方体的大小。
样例输入:
请输入立方体的长m,宽n,高p为:
3 3 3
m*n行中每行的p个正整数为:
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
四、算法分析与步骤描述
1.算法总体过程
2.最优值实现过程中信息的保存
在算法的实现过程中,是将原长方体分解成若干子长方体,每个子长方体都要转化成矩阵,求出各个矩阵的最大子矩阵,最优值就存在于这些最大子矩阵中,如果想获得最优解就必须对各个最大子矩阵的信息进行保存;同理,将子长方体转化成矩阵,分解成若干子矩阵,每个子矩阵都要转化成段,求出各个段的最大子段,要获得最大子矩阵,就得从这些最大子段中比较求得,如果想获得最优解就必须对各个最大子段和的信息进行保存,为此,定义了下面的方法:
static int max(int i,int j)
{
if(i>=j)
return i;
else
return j;
}
3.算法的实现
最大子长方体问题的动态规划算法如下:
static int MaxSum3(int a[][][],int m,int n,int p)
{
int sum=0;
int [][]b=new int [50][50];
int k,i,j,z,x;
for(i=0;i
{
for(z=0;z for(x=0;x b[z][x]=0; //初使化 for( j=i;j { for(z=0;z for(x=0;x b[z][x]+=a[z][x][j]; sum=max(sum,MaxSum2(b,m,n)); } } return sum; } 其中MaxSum2()为最大子矩阵问题的动态规划算法,具体实现过程如下: static int MaxSum2(int a[][],int m,int n) //二维M*N的矩阵 { int sum=0; int []b=new int[50]; int k=0; for(int i=0;i { for(k=0;k b[k]=0; for(int j=i;j { for(k=0;k b[k]+=a[j][k]; sum=max(sum,MaxSum(b,n)); } } return sum; } 五、问题实例及算法运算步骤 设当前子长方体是最优子长方体,用num进行标志,其在i、j和k方向上的起止位置分别为:(i1,i2)、(j1,j2)、(k1,k2)。k1、k2在算法MaxSum3中很容易确定,并已保存在three1,three2变量中;i1、i2要在MaxSum2中确定,它们的值保存在memtwo[num].one1和memtwo[num].one2中,由num1用来标志获得最优子长方体的最优子矩阵;j1、j2的值要在MaxSum1中确定,保存在memone[num1].two1和memone[num1].two2中,并在MaxSum2中赋值memtwo[num].two1 =memone[num1].two1,memtwo[num].two2=memone[num1].two2。若在MaxSum3中判断出当前子长方体是当前的最优解,则进行赋值num3=num,num3最终保存的就是最优子长方体的标志。最优值确定后,进行赋值two1= memtwo[num3].two1,two2= memtwo[num3].two2,one1= memtwo[num3].one1,one2= memtwo[num3].one2,并通过如下算法,输出最大子长方体: for(int i=0;i for(int j=0;j for(int k=0;k a[i][j][k]=Integer.parseInt(sc.next()); System.out.println("所给立方体的最大子长方体为:"); System.out.println(MaxSum3(a,m,n,p)); 六、算法运行截图 七、算法复杂度分析 由于解最大子段和问题的动态规划算法Maxsum1l的时间复杂度为O(n),故算法Maxsum2的双重循环需要O(mn)实践,进一步算法Maxsum3的三重循环则需要O(pmn)时间。