HDU 2064 汉诺塔III 动态规划

解题报告:

题目大意这里就不说了,这里给出题目链接,http://acm.hdu.edu.cn/showproblem.php?pid=2064

这题首先我们应该知道的是如何将N个圆盘从第一杆全部搬到第二根杆跟全部搬到第三根杆和从第二根杆全部搬到第三根杆需要的次数是一样的,然后搬N根杆的次数就可以有搬N-1根杆的次数得到,这里首先给出地推公式,dp[n]=3*dp[n-1]+2;思想就是假设现在要将N个圆盘搬到第三根杆,现在首先要做的是把N-1根杆全部搬到第三根杆,这样一共需要dp[n-1]次,然后第一根杆上面还剩下一个圆盘,现在我们要把这最后一个圆盘放到第二根杆上面,原因待会再解释,然后现在要做的事就是把这一个最大的圆盘放到第三根杆的最下面,然而第三根杆现在正被N-1个圆盘占用了,所以要将这N-1个圆盘移开全部移到第一根杆上面,所以这样需要的次数是dp[n-1]次,好了,现在第三根杆就完全是空的了,就顺利地把最后一个圆盘放到第三根杆上面了,这时再把N-1个圆盘从第一根杆上面移动到第三根杆上面,这样整个游戏就结束了。现在解释一下为什么第二步要把最大的那个盘移动到第二根杆了,很显然如果这一步不把它移到第二根杆的话,那么第三根杆上面的N-1个盘就必须移动到第二根杆上面,而这时最大的盘还在第一根杆上又不可以把它直接移动到第三根杆上面,又不能移到第二根杆上面,因为大盘不能放小盘上面,所以第二步就只好把最大的盘放到第二根杆上面。

 1 #include<cstdio>
 2 __int64 dp[40];
 3 void dabiao() {
 4     dp[0]=0,dp[1]=2,dp[2]=8;
 5     for(int i=3;i<=35;++i)
 6     dp[i]=3*dp[i-1]+2;
 7 }
 8 int main() {
 9     dabiao();
10     int n;
11     while(scanf("%d",&n)!=EOF)
12     printf("%I64d\n",dp[n]);
13     return 0;
14 }
View Code
原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3109338.html