← 返回编程题库
coding-max-cumret-with-bounded-skips中等免费版2000ms未尝试

至多跳过 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 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

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,此时实现回报为负。