最大子长方体问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)时间。

相关文档
最新文档