POJ1958 Strange Towers of Hanoi --- 递推【n盘m塔Hanoi塔问题】

POJ1958 Strange Towers of Hanoi

Sol:

n盘4塔问题可以分为3步:
1.以4塔模式移走i个盘。
2.以3塔模式将剩余n-i个盘移至第4塔。
3.以4塔模式将第一步中的i个盘移至第4塔。
我们用\(d[i]\)表示在3塔模式下移i个盘的最小步数,\(f[i]\)表示在4塔模式下移i个盘的最小步数。
递推式:\(f[i]=\min_{1\leq j < i}(2*f[j]+d[i-j])\)

EX

本题可以拓展至n盘m塔问题。
\(f[i][j]\)表示在i塔模式下移j个盘的最小步数。
递推式:\(f[i][j]=\min_{1\leq k < j}(2*f[i][k]+f[i-1][j-k])\) (maybe

AC CODE:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 12 + 2;
typedef long long ll;
ll d[N],f[N];
//d=n盘3塔 f=n盘4塔 
int main(){
    for(int i=1;i<=12;i++){
        d[i]=2*d[i-1]+1;
//      printf("d[%d]=%d%c",i,d[i],i==12?'\n':' ');
    }
    memset(f,0x3f,sizeof(f));
    f[1]=1;printf("1\n");
    for(int i=2;i<=12;i++){
        for(int j=1;j<i;j++){
            f[i]=min(f[i],2*f[j]+d[i-j]);
        }
        printf("%lld\n",f[i]);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Loi-Brilliant/p/9763690.html
今日推荐