标签:
//动态规划,转移是g[n]=min{g[n-k]+g[n-k]+f[k]}(1<=k<n)其中f[n]是三个柱子时候的汉诺塔
//f[n]=f[n-1]+f[n-1]+1;----->f[n]=2^n-1;
#include<stdio.h>
#include<math.h>
int main()
{
int n,i,k;
double f[66],g[66];
f[1]=2.0;
for(i=2;i<=64;i++)f[i]=f[i-1]*2.0;
for(i=1;i<=64;i++)f[i]-=1.0;
g[1]=1;
for(i=2;i<=64;i++)
{
g[i]=g[i-1]*2+f[1];
for(k=2;k<i;k++)
{
double tmp=g[i-k]*2+f[k];
if(g[i]>tmp)g[i]=tmp;
}
}
while(scanf("%d",&n)!=EOF)
{
printf("%.0lf\n",g[n]);
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/zzzzw/p/4447001.html