一看汉诺塔的次数,第一感觉是数学题,但一看答案是dp出乎意料,
对dp有了更加全面的理解,主要是递归的规划,从复杂的递归回归的
基础的递归
#include <stdio.h>
#include <math.h>
__int64 ans[65];
double _min,temp,f[65];
int main()
{
int i,j,n;
f[0]=1;
for(i=1;i<65;i++)
f[i]=f[i-1]*2;
ans[1]=1;
for(i=2;i<65;i++)
{
_min=pow(2,64)-1;
for(j=1;j<i;j++)
{
temp=2*ans[j]+f[i-j]-1;//这里枚举j,先将j个盘子采用最优策略移到D(多余的)的柱子上,再将剩下的移到C柱子
if(temp<_min)//上,即为3个柱子的汉诺塔模型(因为此时D柱子不可以用),再将j个盘子按照最优策略移到C
_min=temp;
}
ans[i]=_min;
}
while(scanf("%d",&n)!=EOF)
{
printf("%I64d\n",ans[n]);
}
return 0;
}