Time Limit: 2000/1000 MS
(Java/Others) Memory Limit: 65536/32768 K
(Java/Others)
Total Submission(s): 4529 Accepted
Submission(s): 2231
这题想了挺久的,后来才知道要用DP的思想去推。
dp思想:
对于每一个n,可以由i个四根柱子的解加上n-i个三个柱子的解。要把n个盘中的i个移到另一根柱子,需要ans[i]步,再移到目标柱子也需要ans[i]步;而剩下的n-i个盘
要从三根柱子中移到其中的目标柱子要2^(n-i)-1步。故对于每一个n,枚举i=(0,n-1)的情况,最小值为最优解。
注意当n==64时有溢出,稍稍处理一下即可。
代码:
1 //0MS 272K 613 B C++ 2 #include<stdio.h> 3 #include<math.h> 4 __int64 ans[65]={0,1,3,5}; 5 __int64 Min(__int64 a,__int64 b) 6 { 7 return a<b?a:b; 8 } 9 void init() 10 { 11 for(int i=4;i<65;i++){ 12 ans[i]=(__int64)pow(2.0,1.0*i)-1; 13 //printf("**%I64d\n",ans[i]); 14 for(int j=1;j<i;j++){ 15 if(i==64 && j==1) continue; //防止溢出得不到结果 16 __int64 temp=2*ans[j]; 17 temp+=(__int64)pow(2.0,1.0*(i-j))-1; 18 ans[i]=Min(temp,ans[i]); 19 } 20 } 21 } 22 int main(void) 23 { 24 int n; 25 init(); 26 while(scanf("%d",&n)!=EOF) 27 { 28 printf("%I64d\n",ans[n]); 29 } 30 return 0; 31 }
hdu 1207 汉诺塔II (DP+递推),布布扣,bubuko.com
原文:http://www.cnblogs.com/GO-NO-1/p/3693954.html