zoukankan      html  css  js  c++  java
  • [题目] 4座塔的Hanoi

    题目地址

    经典递推题。

    解出 n (1<=n<=12) 个盘子 (4) 座塔的Hanoi(汉诺塔)问题最少需多少步?(1到12每个答案分别占一行)

    题解

    在原Hanoi问题中 (d[i]) 表示 3座塔下 (i) 个盘子的最小步数。如果你还没有忘记的话:

    [d[i]=d[i-1]*2+1 ]

    这个式子还是很显然的。

    我们设 (f[i]) 表示 4座塔下 (i) 个盘子的最小步数。 那么有:

    [f[i]= ext{min}{f[j]*2+d[i-j]}(1<=j<=i) ]

    那我们来仔细康康这个式子,(f[j]) 指将 (j) 个盘子放在 (B) 塔上,剩下的盘子采用 3座塔全部放在 (D) 塔上,再把 (B) 塔上的 (j) 个盘子放在 (D) 塔上。

    Code

    #include<bits/stdc++.h>
    #define N 15
    using namespace std;
    int n;
    int f[N],d[N];
    int main()
    {
    	memset(f,0x3f,sizeof(f));
    	d[1] = f[1] = 1; puts("1");
    	for(int i=2;i<=12;++i) {
    		d[i] = d[i-1]*2 + 1;
    		for(int j=1;j<=i;++j) {
    			f[i] = min(f[i],f[j]*2+d[i-j]);
    		}
    		printf("%d
    ",f[i]);
    	}
    	return 0;
    }
    

    理解了之后,我们可以来思考一下 (n) 个盘子 (m) 座塔的做法。

    我们设 (f[i][j])(i) 座塔 ,(j) 个盘子的最少步数,那么有:

    [f[i][j]= ext{min}{f[i][k]*2+f[i-1][j-k]} ]

    其实原理是一样的。

    睡个好觉吧,晚安!

  • 相关阅读:
    2019.08.26 学习整理
    day28
    python-day25(正式学习)
    自闭的一天
    python-day18(正式学习)
    python-day17(正式学习)
    python-day16(正式学习)
    别点进来!!!
    python-day15(正式学习)
    python-day14(正式学习)
  • 原文地址:https://www.cnblogs.com/BaseAI/p/11410041.html
Copyright © 2011-2022 走看看