算法导论课程设计_最大长方体问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最大长方体问题

Problem description

一个长,宽,高分别为m,n,p 的长方体被分割成个m*n*p 个小立方体。每个小立方体内有一个整数。试设计一个算法,计算出所给长方体的最大子长方体。子长方体的大小由它所含所有整数之和确定。

Input

输入的第1 行是3 个正整数m,n,p,1≤m,n,p≤50。接下来m*n行每行p个正整数,表示小立方体中的数。

Output

程序运行结束时,输出计算出的最大子长方体的大小。

Sample Input

3 3 3

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

Sample Output

14

#include "stdio.h"

#include

int MaxSum(int n,int* a){//用动态规划算法计算“最大子段和问题”,对应于一维数组int sum=0,b=0;

int i=0;

for (i=1;i<=n;i++) {

if (b>0) {

b+=a[i];

}

else b=a[i];

if (b>sum) {

sum=b;

}

}

return sum;

}

int MaxSum2(int m,int n,int a[][50]){//用动态规划算法计算“最大子矩阵问题”,对应二维数组

int sum=0;

int b[50];

memset(b,0,sizeof(b));

int i=0,j=0,k=0;

for (i=1;i<=m;i++) {

for(k=1;k<=n;k++) b[k]=0;

for (j=i;j<=m;j++) {

for(k=1;k<=n;k++) b[k]+=a[j][k];

int max=MaxSum(n,b);

if(max>sum) sum=max;

}

}

return sum;

}

int MaxSum3(int m,int n,int p,int a[][50][50]){//用动态规划算法计算“最大子长方体问题”,对应

int sum=0;

int b[50][50];

memset(b,0,sizeof(b));

int i,j,k1,k2;

for (i=1;i<=m;i++) {

memset(b,0,sizeof(b));

for(j=i;j<=m;j++){

for(k1=1;k1<=n;k1++)

for(k2=1;k2<=p;k2++)

b[k1][k2]+=a[j][k1][k2];

int max=MaxSum2(n,p,b);

if(max>sum) sum=max;

}

}

return sum;

}

int main(){

int m,n,p;

scanf("%d%d%d",&m,&n,&p);

int i,j,k;

int a[50][50][50];

memset(a,0,sizeof(a));

for(i=1;i<=m;i++)

for(j=1;j<=n;j++)

for(k=1;k<=p;k++)

scanf("%d",&a[i][j][k]);

printf("%d\n",MaxSum3(m,n,p,a));

return 0;

}

相关文档
最新文档