poj 1958

传送门

四塔汉诺塔问题,转移方程非常玄学,f[i]=min(f[j]*2+d[i-j]) (1 <=j < i),d表示三塔下的汉诺塔问题,这个方程的意思是将j个在四塔模式下有A挪到B,然后把其余i-j个在三塔模式下移到D,最后再将j个在四塔模式下挪到D。

代码

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
const int N = 15;

int f[N],d[N];

int main(){
    int n=12;memset(f,0x3f,sizeof(f));
    d[1]=f[1]=1;
    for(register int i=1;i<=n;i++)
        d[i]=d[i-1]*2+1;
    for(register int i=1;i<=n;i++)
        for(register int j=1;j<i;j++)
            f[i]=min(f[i],f[j]*2+d[i-j]);
    for(register int i=1;i<=n;i++) cout<<f[i]<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/sdfzsyq/p/9676832.html