算法竞赛训练指南,54 页, 三维的前缀和
本题要点:
1、 定义前缀和:
将长方体切片(按z左边), 每一片就是一个平面;
sum[i][j][k]平面上[1,1]到[i][j]在高度为 z == k 时的区域前缀和;
二维的前缀和公式:
sum(x, y) = array[x][y] + sum(x - 1, y) + sum(x, y - 1) - sum(x - 1, y - 1)
2、求解最大和 的子 长方体:
遍历底面的左边范围 [x1, x2], [y1, y2] (此时相当于固定了底面), 在遍历 第z 层,
pre: 表示 以第 z - 1 层 结尾的 子长方体 的最大和。
tmp: 表示 当前层(第z层)子长方体 的 和;
如果 pre > 0, 以第 z 层 结尾的 子长方体 的最大和 为 tmp + pre, 否则 为 tmp;
最后, 用 ans 不断更新 ans = max(ans, tmp)即可。
3、 注意使用 long long 来存储每一个点的值
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int MaxN = 25;
const LL INF = 1LL << 60;
int A, B, C, Test;
LL sum[MaxN][MaxN][MaxN];// sum[i][j][k]平面上[1,1]到[i][j]在高度为k时的区域前缀和
LL getSum(int x1, int x2