【dp】POJ 1958 特殊的汉诺塔

链接

http://poj.org/problem?id=1958

大意

求出 n 个盘,4个塔的最小步数

解题思路

随便写个 d p 。。。

f [ i ] [ j ] 表示 i 个塔, j 个盘的最小步数

我们先忽略掉 i < 3 的情况

在我们做过的汉诺塔原题中,可以得到:

f [ i ] [ j ] = 2 j 1                             ( i = 3 )

那如果是四座塔,其实就是在3的基础上多移两次,并加上剩下的盘在少一座塔时候的答案,即:

f [ i ] [ j ] = m i n { 2 f [ k ] + f [ i 1 ] [ j k ] }                             ( 1 k < n )

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f[13],n;
signed main()
{
    f[1]=1;
    putchar(49);putchar(10);//1的情况直接输出
    for(register int n=2;n<=12;n++)
    {
        f[n]=2+(~-(1<<(~-n)));
        for(register int i=2;i<n;i++)
            f[n]=min((f[i]<<1)+(~-(1<<(n-i))),f[n]);//动态转移
        printf("%d\n",f[n]);
    }
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/81611416