跳转至

递归训练:逐项合并最大值

出题人解法:递归求前缀最大值,再与末项比较。Codex(GPT-6):整理区间接口和边界证明,并补充降低调用深度的平衡递归方案。

首选递归

使用零起始、左闭右开的区间 \([l,r)\) .若 \(r-l=1\) ,返回唯一元素;否则返回

\[ M(l,r)=\max\{M(l,r-1),a_{r-1}\} \]

初始调用 \(M(0,n)\) .数组通过常量引用传递,不在每层复制。

当区间只有一个元素时返回值正确。长度更大时,前 \(r-l-1\) 项的最大值由递归正确求出,与最后一项取最大即得到整个区间最大值。对区间长度归纳可证答案正确。返回实际元素而非零,保证全负数输入正确。

代价与递归要求

有 \(n\) 次递归调用、\(n-1\) 次比较,时间 \(O(n)\) .调用链最多 \(n\) 层,栈空间 \(O(n)\) ;保存输入数组后总空间仍为 \(O(n)\) .本题 \(n\le100\) ,该深度适用。

std.cpp 用递归返回值参与最大值计算,满足实现要求。单看输出无法验证递归,因此使用本题作训练时还须检查源代码。

平衡区间递归和 alternative.cpp把调用深度降为 \(O(\log(n+1))\) ,保留 \(O(n)\) 总时间。它有明确的辅助栈优势,作为并列方案;两者的输入数组都占 \(O(n)\) ,不能把平衡方案的总空间写成对数。两份程序均通过完整正式数据。

测试配方见 plan.json,生成方式见数据生成说明。参考环境、逐次测量和适用范围见评测说明。