You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用INT32_MAX求解DP问题返回错误值,替换自定义INF正常的原因

问题原因:有符号整数溢出导致的未定义行为

这是一个典型的溢出问题,咱们一步步拆解为什么用INT32_MAX会出错:

首先,INT32_MAX的数值是2147483647,这是32位有符号整数能表示的最大值。在你的递归逻辑里,当curr_loc > maze_size时会返回这个边界值,但问题就出在这行核心计算代码:

now = min(now, JumpToNext(curr_loc + next) + 1);

当JumpToNext(curr_loc + next)返回INT32_MAX时,执行+1操作会触发有符号整数溢出。根据C++标准,有符号整数溢出属于未定义行为——编译器可以生成任意结果,在大多数补码实现的系统里,这个溢出会让数值“绕回”成负数(比如2147483647 + 1会变成-2147483648,你看到的-2147483647也是溢出后的一种异常结果)。

这个负数会被错误地当作“更小的有效值”参与min计算:原本now初始化为INT32_MAX,结果被更新成这个负数,后续递归读取cache里的错误值时,整个逻辑彻底偏离预期,最终返回的ans变成负数,而不是你期望的INT32_MAX,导致输出时跳过cout << -1的分支,直接输出了错误的负数。

而你自定义的INF = 987654321则完全避开了这个问题:它远小于INT32_MAX,987654321 + 1 = 987654322,仍然在32位有符号整数的取值范围内(小于2147483647),不会触发溢出,所以min操作能正确比较,递归逻辑也能正常执行。

额外小建议

如果想继续使用标准库的极值,也可以选择INT32_MAX - 1作为边界值,确保+1后不会溢出,但自定义一个足够大且安全的INF(比如你用的987654321)会更直观,也避免了记数值的麻烦。

内容的提问来源于stack exchange,提问作者skull Kim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 14:32:54