80分求助
查看原帖
80分求助
939150
Deep_Lover楼主2025/7/24 20:34
#include <bits/stdc++.h>
using namespace std;

const int MAX_N = 1e6 + 1;
int n;
int memo[MAX_N];  // 记忆化数组,存储已计算的结果

// 计算将数字rem变换到0的最少步数
int dfs(int rem) {
    // 边界条件处理
    if (rem < 0) return 1e9;  // 无效情况,返回一个很大的值
    if (rem == 0) return 0;   // 已经是0,不需要步数
    
    // 如果已经计算过,直接返回缓存的结果
    if (memo[rem] != 0) return memo[rem];
    
    int steps;
    if (rem % 2 == 1) {
        // 奇数只能减1
        steps = dfs(rem - 1) + 1;
    } else {
        // 偶数可以选择减1或除以2,取最小值
        steps = min(dfs(rem - 1), dfs(rem / 2)) + 1;
    }
    
    // 缓存结果并返回
    return memo[rem] = steps;
}

int main() {
    // 输入目标数字
    cin >> n;
    
    // 可以预初始化一些已知值以优化计算速度
    memo[1] = 1;   // 1 -> 0 需要1步(减1)
    memo[2] = 1;   // 2 -> 1 -> 0 或 2/2=1 -> 0,最少1步
    // 其他值会在递归过程中自动计算
    
    // 计算并输出结果
    cout << dfs(n) << endl;
    
    return 0;
}

2025/7/24 20:34
加载中...