码迷,mamicode.com
首页 > 其他好文 > 详细

[POJ1958]Strange Towers of Hanoi

时间:2019-06-15 09:30:03      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:std   res   ret   main   含义   代码   printf   span   name   

分析

汉诺四塔

\(f[i]\) 表示求解 \(i\) 盘四塔的最少步数,设 \(d[i]\) 表示求解 \(i\) 盘三塔的最少步数:
\[ d[i]=2\cdot d[i-1]+1\f[i]=\min_{j=1}^{i-1}\left\{2\cdot f[j]+d[i-j]\right\} \]
第二个递推式的含义是,将 \(j\) 盘在四塔模式下移动到一个中转柱,将剩余的 \(n-j\) 盘在三盘模式下移动到目标柱,再将那 \(j\) 个盘在四盘模式下移动到目标柱。

代码

#include<cstdio>
#include<algorithm>
using namespace std;
int n,f[20],d[20];
int D(int x){
    if(x==1)return 1;
    if(d[x])return d[x];
    return d[x]=D(x-1)*2+1;
}
int F(int x){
    if(x==1)return 1;
    if(f[x])return f[x];
    int res=0x3f3f3f3f;
    for(int i=1;i<x;i++)res=min(res,F(i)*2+D(x-i));
    return f[x]=res;
}
int main(){
    for(int i=1;i<=12;i++)printf("%d\n",F(i));
    return 0;
}

[POJ1958]Strange Towers of Hanoi

标签:std   res   ret   main   含义   代码   printf   span   name   

原文地址:https://www.cnblogs.com/sshwy/p/11026366.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!