uval0755Garbage Heap

题意:给出一个三维的由单位立方体组成的长方体,每个单位立方体有一个值,求这个大的长方体的一个子长方体,使得构成它的单位立方体对应的值之和最大。

分析:这是经典问题从一维延伸到三维的情况。画图后就能解决~构造前缀和a[i][j][k]表示以它为右下角的立方体和,然后枚举,复杂度O(n6),这道题目肯定能过。

代码:

View Code
 1 #include <stdio.h>
 2 #include <algorithm>
 3 using namespace std;
 4 long long a[21][21][21];
 5 int main(){
 6     int cas, line = 0;
 7     scanf("%d", &cas);
 8     while(cas--){
 9         int n, m, p, i, j, k, x, y, z;
10         scanf("%d%d%d", &n, &m, &p);
11         for(i=1; i<=n; i++) for(j=1; j<=m; j++) for(k=1; k<=p; k++) 
12             scanf("%lld", &a[i][j][k]);
13         for(i=1; i<=n; i++) for(j=1; j<=m; j++) for(k=1; k<=p; k++)
14             a[i][j][k]+=a[i][j][k-1];
15         for(i=1; i<=n; i++) for(j=1; j<=m; j++) for(k=1; k<=p; k++)
16             a[i][j][k]+=a[i][j-1][k];
17         for(i=1; i<=n; i++) for(j=1; j<=m; j++) for(k=1; k<=p; k++)
18             a[i][j][k]+=a[i-1][j][k];
19         long long ans = -0x3f3f3f3f3f3fll;
20         for(i=0; i<n; i++) for(j=0; j<m; j++) for(k=0; k<p; k++)
21             for(x=i+1; x<=n; x++) for(y=j+1; y<=m; y++) for(z=k+1; z<=p; z++)
22                 ans = max(ans,  a[x][y][z]-a[i][j][k] + a[i][j][z]-a[i][y][z] + a[i][y][k]-a[x][y][k] + a[x][j][k]-a[x][j][z]);
23         if(line++) printf("\n");
24         printf("%lld\n", ans);
25     }
26     return 0;
27 }

发现如果不包含algorithm头文件max函数报错~

Greatness is never a given, it must be earned.
原文地址:https://www.cnblogs.com/zjutzz/p/2910325.html