本文共 895 字,大约阅读时间需要 2 分钟。
为了解决这个问题,我们需要找到将所有点的值变为1所需的最少起跳次数。每次起跳会影响后续的点,具体来说,起跳点的值减少一次,并且起跳会影响后续点的跳跃次数。
我们可以使用动态规划来解决这个问题。具体步骤如下:
b,其中 b[i] 表示点 i 被跳跃的次数。i,计算 b[i]。根据前点的跳跃次数和当前点的初始值,确保 b[i] 不超过当前点的初始值,并且不低于前点的跳跃次数加上某个值。#include#include void solve() { int n; std::vector a(n + 1); std::vector b(n + 1); b[0] = 0; for (int i = 1; i <= n; ++i) { b[i] = std::max(b[i - 1], a[i] - (b[i - 1] - 1)); if (b[i] > a[i]) { b[i] = a[i]; } } int ans = 0; for (int i = 1; i <= n; ++i) { ans += b[i]; } std::cout << ans << '\n';}
a 和 b。i,计算 b[i]。使用 std::max 确保 b[i] 不低于前点的跳跃次数加上某个值,并使用 std::min 确保 b[i] 不超过当前点的初始值。这种方法确保了每个点的跳跃次数被合理计算,避免了不必要的跳跃,从而最小化了总的起跳次数。
转载地址:http://dkwzz.baihongyu.com/