1 条题解

  • 0
    @ 2026-10-18 18:37:52

    G4027 [GESP202609 四级] 新汉诺塔 题解

    知识点:递推、状态设计、数学建模。

    解题思路

    设one[n]为顺方向跨一根柱的最少步数,two[n]为跨两根柱的最少步数。递推one[n]=2two[n-1]+1,two[n]=2two[n-1]+one[n-1]+2,答案取two[n]。

    为什么正确

    移动最大盘前后,小盘堆必须转移到唯一合法的辅助柱;分解后的转移分别对应这两个状态,且各子步骤的最优值可依次达到。

    易错点

    更新两状态前保留旧值;不能用普通汉诺塔2^n-1公式,方向限制改变了递推。

    复杂度

    时间O(n),空间O(1)。

    参考代码(C++17)

    #include<bits/stdc++.h>
    
    using namespace std;
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int n;
        cin>>n;
        long long one=0,two=0;
        for(int i=1;i<=n;i++) {
            long long a=2*two+1,b=2*two+one+2;
            one=a;
            two=b;
        }
        cout<<two;
    }
    

    说明

    本题解为配套教学整理,非官方题解。复杂度按本页参考实现计算,题库使用10个自行生成的测试点。

    • 1

    信息

    ID
    723
    时间
    1000ms
    内存
    512MiB
    难度
    普及
    标签
    递交数
    1
    已通过
    1
    上传者