标签:dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1207
1 3 12
1 5 81
【分析】
四个柱子的汉诺塔问题,求最少移动次数;
我们知道,经典汉诺塔问题(三个柱子),最少移动步数是2^n-1, 我们将4个柱子依次命名为A,B,C,D; 我们的目标是将盘子从A移动到D;
假设初始有n个盘子在A,(1<=r<=n), 我们将最上面(n-r)个盘子通过 C,D移动到B,则移动步数=F【n-r】,
然后由于现在A上面的盘子都不能放到B上,所以回到了经典汉诺塔问题,将剩余的r个盘子,通过C 移动到 D, 移动步数=2^r-1;
然后再将 B上面的(n-r)个盘子,通过C,A移动到D,需要移动步数=F【n-r】;
因为要求最少移动步数,所以我们可以通过一个for循环,来遍历求得最小值;
【代码如下】
#include <iostream> #include <algorithm> #include <cmath> using namespace std; typedef unsigned long long ll; int main() { ll f[100]; f[0]=999999999; f[1]=1; f[2]=3; for(int i=2;i<70;i++) { f[i]=f[i-1]*2+(ll)pow(2,1)-1; for(int j=2;j<=i;j++) { f[i]=min(f[i],f[i-j]*2+(ll)(pow(2,j)-1));//当j= 64的时候,达到题目要求的最大范围,2^64-1正好也是unsigned long long 的最大表示范围; } } //cout<<f[60]<<endl; int t; while(cin>>t) { cout<<f[t]<<endl; } return 0; }
多柱汉诺塔问题探究请戳 大神博客
http://www.cnblogs.com/fanzhidongyzby/archive/2012/07/28/2613173.html;
标签:dp
原文地址:http://blog.csdn.net/chaiwenjun000/article/details/45897295