多了一根柱子,还是原来的移动方法,只不过原来是先将n-1移开,再移动剩下1个,而现在多了一根柱子,所以可以先将原来x根借助两根柱子移开,再将剩下拉的n-x借助一棵柱子移开(2^(n-x)-1),状态转移方程f[n]=min(f[j]*2+2^(n-j)-1)
#include <stdio.h>
#include <math.h>
__int64 f[70];
__int64 ans;
void dp()
{
int i,j;
f[1]=1;
f[2]=3;
for (i=3;i<=64;i++)
{
ans=9999999999;
for (j=1;j<i;j++)
if (f[j]*2+pow(2.0,i-j)-1<ans)
ans=f[j]*2+pow(2.0,i-j)-1;
f[i]=ans;
}
}
int main()
{
int n;
dp();
while(scanf("%d",&n)==1)
printf("%I64d\n",f[n]);
return 0;
}