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

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

时间:2018-10-09 23:09:40      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:names   string   模式   printf   algorithm   memset   def   range   cst   

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;
}

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

标签:names   string   模式   printf   algorithm   memset   def   range   cst   

原文地址:https://www.cnblogs.com/Loi-Brilliant/p/9763690.html

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