函数递归到底存了什么
  • 板块学术版
  • 楼主Delov
  • 当前回复12
  • 已保存回复12
  • 发布时间2023/7/8 20:36
  • 上次更新2023/11/3 11:00:09
查看原帖
函数递归到底存了什么
277792
Delov楼主2023/7/8 20:36

大概是在做树上背包,简化代码如下,实际的代码有很多分类讨论转移,所以下面的某些操作可能看起来不是那么合理,只是为了体现那一部分都调用了什么。


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 ,为什么会爆栈。求助万能的谷民。

2023/7/8 20:36
加载中...