根据对称性,如果需要跳到负轴上,直接将其转为相反数

定义 dp[i] 为跳到 i 点时需要的最少步数

当 i 为偶数时,可以直接从 dp[i/2] 跳一步过来;

当 i 为奇数时,可以从 dp[i-1] 向前走一步过来,也可以从 dp[(i+1)/2] 跳一步到 dp[i+1] ,再退一步回到 dp[i] ,取较小值

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    while (cin >> n) {
        if (n < 0) {
            n = -n;
        }
        vector<int> dp(n + 1);
        dp[0] = 0, dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            if (i % 2 == 0) {
                dp[i] = dp[i / 2] + 1;
            } else {
                dp[i] = min(dp[i - 1] + 1, dp[(i + 1) / 2] + 2);
            }
        }
        cout << dp[n] << endl;
    }
    return 0;
}

时间复杂度:O(n),用于求 dp

空间复杂度:O(n),用于存储 dp