至多跳过 K 期下的最大已实现累积收益
Maximum Realised Cumulative Return When Allowed To Skip At Most K Periods
开始编码实现 solution(returns: list[float], k: int) -> float。给定长度为 N 的每期回报序列 returns(可理解为该策略每期保持开仓时本应记入的对数或算术回报)与非负整数跳过预算 k,交易者被要求每期保持策略开启,**仅能选择至多 k 期跳过**。被跳过的那一期贡献恰好 0.0 —— 当期位置空仓,回报既不入账也不被反向取负;保留的那些期贡献它们带符号的原始 return。返回所有合法跳过方案下的已实现累积和最大值。
保留的期必须保持原顺序(构成 returns 的一个子序列,而非连续子数组)。当 k >= N 时,交易者可以跳过所有期,已实现累积回报至少为 0.0(空和)。当 k < N 时,至少必须保留 N - k 期,答案可以严格为负。
例:solution([0.02, -0.05, 0.03, -0.04, 0.01], 1) 返回 0.02。给一次跳过预算时,最优选择是跳过 return = -0.05 的那一期:0.02 + 0.03 + (-0.04) + 0.01 = 0.02;改跳 -0.04 只得 0.01,不跳则只能拿到不打折的 -0.03。当 k = 2 时跳掉两期负值得 0.06;当 k = 0 时被锁死在全和 -0.03。
区分点:枚举所有大小 <= k 的跳过子集是 O(N * binom(N, k)),在 N 中等规模就会超时。目标解法是关于 (前缀长度, 已用跳过次数) 的 O(N * k) DP,配合 O(k) 滚动空间;详见 stubs/stub.py。
实践背景
当一个量化团队回顾性地问"如果允许我们在事后视角下、把这段回测窗口里**最差的至多 k 期 (事后看是策略本就不该处理的 risk-off 冲击、流动性预约空窗等)做空仓处理,那么策略本应记入的已实现回报会是多少",答案恰好是这个最大值。这个数字不是**任何可交易策略的产出:它需要事后完美知道哪 k 期最差。它通常被用作跳过捕获率(skip-capture ratio)的分子或分母——某个候选的"风险信号 / 风险叠加层"模型如能捕获该事后最优上界的 0.6,就被认为对"识别坏期"做得不错;只能捕获 0.1 的模型则与随机跳过差异不大。该上界是紧的(允许使用少于 k 次跳过),所以这个上限和交易台真实允许的预算口径一致。
约束条件
- 0 <= N <= 2000,其中 N 为 solution(returns, k) 的 returns 输入长度
- 0 <= k <= 2000;k 为整数;当 k >= N 时交易者可以跳过每一期
- 每个 returns[i] 为 [-1.0, 1.0] 内的有限浮点数;当 k < N 且保留期之和为负时答案可以是负数
- 输出为有限浮点数(已实现累积收益);比较器为 float,rel_tol = 1e-9,abs_tol = 1e-12
- 空 returns 输入恒返回 0.0,与 k 无关
样例
Case 1 · statement-example: k=1 skip the worst negative
输入: [[0.02,-0.05,0.03,-0.04,0.01],1]
期望: 0.020000000000000004
跳过 -0.05 这一期:0.02+0.03-0.04+0.01 = 0.02。仅允许跳 1 期,故跳第二大负值 -0.04 反而更差。
Case 2 · statement-example: k=2 skips both negatives
输入: [[0.02,-0.05,0.03,-0.04,0.01],2]
期望: 0.060000000000000005
预算 k=2 足够跳掉两个负值:0.02+0.03+0.01 = 0.06。
Case 3 · statement-example: k=0 forces every period kept
输入: [[0.02,-0.05,0.03,-0.04,0.01],0]
期望: -0.030000000000000006
不允许跳过:0.02+(-0.05)+0.03+(-0.04)+0.01 = -0.03,此时实现回报为负。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example: k=1 skip the worst negative
输入: [[0.02,-0.05,0.03,-0.04,0.01],1]
期望: 0.020000000000000004
跳过 -0.05 这一期:0.02+0.03-0.04+0.01 = 0.02。仅允许跳 1 期,故跳第二大负值 -0.04 反而更差。
Case 2 · statement-example: k=2 skips both negatives
输入: [[0.02,-0.05,0.03,-0.04,0.01],2]
期望: 0.060000000000000005
预算 k=2 足够跳掉两个负值:0.02+0.03+0.01 = 0.06。
Case 3 · statement-example: k=0 forces every period kept
输入: [[0.02,-0.05,0.03,-0.04,0.01],0]
期望: -0.030000000000000006
不允许跳过:0.02+(-0.05)+0.03+(-0.04)+0.01 = -0.03,此时实现回报为负。