poj1958 strange towers of hanoi
说是递推,其实也算是个DP吧。
就是4塔的汉诺塔问题。
考虑三塔:先从a挪n-1个到b,把最大的挪到c,然后再把n-1个从b挪到c,所以是
f[i] = 2 * f[i-1] + 1;
那么4塔类似:
先在4塔模式下挪j个到b,然后在三塔模式下挪n-j个到d,然后再在4塔模式下挪j个到d。
故状态转移方程:
d[i] = min(2 * d[j] + f[n-j]) ,其中1 <= j < n
初始条件:f[n]与d[1] = 1;
然后就没有然后了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 const int N = 100010,INF=0x7f7f7f7f; 5 int f[N],d[N]; 6 int main() 7 { 8 f[1]=d[1]=1; 9 f[2]=d[2]=3; 10 for(int i=3;i<=12;i++) { 11 f[i]=2*f[i-1]+1; 12 } 13 for(int i=3;i<=12;i++) 14 { 15 int temp=INF; 16 for(int j=1;j<i;j++) 17 temp=min(temp,2*d[j]+f[i-j]); 18 d[i]=temp; 19 } 20 for(int i=1;i<=12;i++) 21 printf("%d\n",d[i]); 22 23 return 0; 24 }