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;

然后就没有然后了。

 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 }
AC代码

 

posted @ 2018-05-06 15:38  garage  阅读(103)  评论(0编辑  收藏  举报