3-13 最大长方体问题
问题描述
一个长,宽,高分别为 m,n,p 的长方体被分割成个 m*n*p 个小立方体。每个小立方体 内有一个整数。试设计一个算法,计算出所给长方体的最大子长方体。子长方体的大小由它 所含所有整数之和确定。
对于给定的长,宽,高分别为 m,n,p 的长方体,编程计算最大子长方体的大小。
数据输入:
第 1 行是 3 个正整数 m,n,p,1<= m,n,p<=50。接下 来 m*n 行每行 p 个正整数,表示小立方体中的数。
Java
import java.util.Scanner;
public class ZuiDaChangFangTi {
private static int m, n, p;
private static int[][][] a;
private static int[][] b;
public static void main(String[] args) {
int max, sum;
Scanner input = new Scanner(System.in);
while (true) {
//还原初始值
sum = 0;
m = input.nextInt();
n = input.nextInt();
p = input.nextInt();
a = new int[m][n][p];
b = new int[n][p];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k < p; k++)
a[i][j][k] = input.nextInt();
for (int i = 0; i < m; i++) {
for (int k = 0; k < n; k++)
for (int t = 0; t < p; t++)
b[k][t] = 0;
for (int j = i; j < m; j++) {
for (int k = 0; k < n; k++)
for (int t = 0; t < p; t++)
b[k][t] += a[j][k][t];
max = maxSum2(b);
if (max > sum)
sum = max;
}
}
System.out.println(sum);
}
}
private static int maxSum2(int[][] a){
int sum = 0;
int[] b = new int[p];
for(int i=0; i<n; i++){
for(int k=0; k<p; k++)
b[k] = 0;
for(int j=i; j<n; j++){
for(int k=0; k<p; k++)
b[k] += a[j][k];
int max = maxSum(b);
if(max > sum)
sum = max;
}
}
return sum;
}
private static int maxSum(int[] a){
int sum = 0, b = 0;
for(int i=0; i<p; i++){
if(b > 0)
b += a[i];
else
b = a[i];
if(b > sum)
sum = b;
}
return sum;
}
}
Input & Output
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
14
Reference
王晓东《计算机算法设计与分析》(第3版)P93
948



被折叠的 条评论
为什么被折叠?



