大概是在做树上背包,简化代码如下,实际的代码有很多分类讨论转移,所以下面的某些操作可能看起来不是那么合理,只是为了体现那一部分都调用了什么。
const int maxn = 5010;
void Max(int &x, int y) { (x < y) && (x = y); }
struct Ver {
int f[maxn][2][2];
void Clear(int n) { memset(f, -0x3f, sizeof(int) * 4 * (n + 1)); }
void Init() { memset(f, -0x3f, sizeof(f)); }
} F[maxn], tt;
void Dfs(int u) {
siz[u] = 1;
F[u].f[1][1][1] = (a[E[u][0]].fir - a[u].fir);
int last = a[E[u][0]].fir;
for (auto v : E[u]) {
Dfs(v);
F[u] = Mul(F[u], F[v], siz[u], siz[v], a[v].fir - last);
last = a[v].sec;
siz[u] += siz[v];
}
last = a[u].sec - a[E[u].back()].sec;
Dwn(i, siz[u], 0) Rep(a, 0, 1) Rep(b, 0, 1) Max(F[u].f[i + 1][a][1], F[u].f[i][a][b] + last),
(b && (F[u].f[i][a][b] += last));
Rep(i, 0, siz[u]) Rep(a, 0, 1) Rep(b, 0, 1)tt.f[i][a][b] = F[u].f[i][a][b], F[u].f[i][a][b] = INF;
Rep(i, 0, siz[u]) Rep(a, 0, 1) Rep(b, 0, 1)Max(F[u].f[i+1][a][b], tt.f[i][a][b]);
}
代码的静态内存为 380MB 左右,也没有使用动态内存的容器,树的大小只有 5000,题目内存限制为 512MB,但是测试发现在递归时会 MLE,改为非递归可以通过。
所以递归到底会保存什么信息?临时变量也只有一个 int ,为什么会爆栈。求助万能的谷民。