最大长方体问题

描述
一个长,宽,高分别是m,n,p的长方体被分割成m*n*p个小立方体。每个小立方体内含一个整数。试着设计一个算法,计算所给长方体的最大子长方体。子长方体的大小由它内部所含所有整数之和确定。 约定:当该长方体所有元素均为负数时,输出最大子长方体为0。
输入格式
第一行3个正整数m,n,p,其中 1<=m,n,p<=50 接下来的m*n行中每行p个整数,表示小立方体中的数。
输出格式
第一行中的数是计算出的最大子长方体的大小。
输入样例
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
 

思路:

1,先编写一维的“最大字段和”的解法。
2,基于“最大字段和”,编写二维的“最大子矩阵和”的解法。
3,基于“最大子矩阵和”,编写三维的“最大子长方体和”的解法。

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;

int t[3][3][3];
int max1(int *a, int n){
    int sum=0,b=0;
    int i;
    for(i=0;i<n;i++){
        if(b>0) b+=a[i];
        else
            b=a[i];
        if(b>sum) sum=b;
    }
    return sum;
}
int max2(int m,int n,int**a){
    int max=0,sum;
    int i,j,k;
    int b[3];
	for(i=0;i<m;i++){
        for(j=0;j<n;j++)	b[j]=0;
        for(k=i;k<m;k++){
            for(j=0;j<n;j++)
                b[j]+=a[k][j];
           sum=max1(b,n);
            if(sum>max)
                max=sum;
        }
    }
    return max;
}

int max3(int m,int n,int p,int a[3][3][3]){
    int max=0,sum;
    int i,j,k,r;
    int **c=new int *[n];
    for(i=0;i<n;i++)
        c[i]=new int [p];
    for(i=0;i<m;i++){
        for(j=0;j<n;j++)
            for(k=0;k<p;k++)
                c[j][k]=0;
        for(r=i;r<m;r++){
            for(j=0;j<n;j++)
                for(k=0;k<p;k++)
                    c[j][k]+=a[r][j][k];
            sum=max2(n,p,c);
            if(sum>max)
                max=sum;
       }
    }
    return max;
}
int main(){
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			for(int k=0;k<3;k++){
				scanf("%d",&t[i][j][k]);
			}
		}
	}
	printf("%d",max3(3,3,3,t));
	return 0; 
}

猜你喜欢

转载自blog.csdn.net/cqwoniu/article/details/84261920