多了一根柱子,还是原来的移动方法,只不过原来是先将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; }