很有可能是 bib_ibi 的边界问题。可能你注意到了后面的人的 bib_ibi 会影响到前面的人的 bib_ibi ,然后预处理了一下。
很不幸,这样子是错误的。
bib_ibi 的求解不是一劳永逸的事情,因为每次转移时有的位置你已经选了。应该在每次转移时单独算出此次可以转移到后面多少个人。
int up = n - i; for(int d = 0; d <= b[i] and d + i <= n; ++d) if(((j >> d) & 1) == 0) up = min(up, d + b[i + d]);