POj-1958 Strange Towers of Hanoi-递推

3人阅读 评论(0) 收藏 举报
分类:

问题描述:
解出n个盘子4座塔的汉诺塔问题最少需要多少步?
AC代码:

int h3[20],h4[20];
int main()
{
    int n;
    while(cin >> n)
    {
        for(int i = 1; i <= n - 1; ++i)//预处理
            h3[i] = 2 * h3[i - 1] + 1;
        memset(h4,0x3F,sizeof(h4));//初始化为最大值
        h4[1] = 1;//边界
        for(int i = 1; i <= n; ++i)//对于h[i]
            for(int j = 1; j <= i - 1; ++j)//枚举寄存的盘子数j
                h4[i] = min(h4[i],2 * h4[j] + h3[i - j]);
        cout << h4[n] << endl;
    }
    return 0;
}

解决方法:
这道题是经典汉诺塔问题的一个变形,由于4塔汉诺塔与3塔汉诺塔之间存在着关系,所以先来考虑3塔汉诺塔
有3根柱子分别为A、B、C,A柱上有n个盘子,要将这n个盘子从A柱移动到C柱,需要经过3个步骤:①将A柱上的n-1个盘子移动到B柱上②将第n个盘子从A柱移动到C柱③将B柱上的n-1个盘子移动到C柱
设h3[n]为从起始柱向目标柱移动n个盘子所花费的操作数,则d[n] = 2 * d[n - 1] + 1,d[1] = 1
而本题多了一个柱子,这个柱子可以寄存一些盘子。3塔模式下步数是确定的,为什么到了4塔模式就要求最小值了呢,这与在“多余”的那根柱子上寄存多少个盘子是有关系的,我们可以枚举这个值
为了分析方便,我们从初始局面开始考虑,假如我们寄存i个盘子到D柱上,A柱上剩下的n-i个盘子就只能在3塔模式下进行操作移动到C柱上,然后D柱上的i个盘子在4塔模式下移动到C柱上
于是递推公式为:
h4[n]=min1i<n{2h4[i]+h3[ni]}

查看评论

POJ 1958 Strange Towers of Hanoi

求4条柱子的汉诺塔问题所需要的移动次数. 题目中已经给出了算法,实现就可以了. 代码里把k值打表了. #include #include using namespace std; int...
  • zxjcarrot
  • zxjcarrot
  • 2014-03-14 15:58:06
  • 301

POJ-1958 Strange Towers of Hanoi(线性动规)

POJ-1958 Strange Towers of Hanoi(线性动规)
  • Dacc123
  • Dacc123
  • 2016-01-04 19:35:15
  • 215

poj 1958 Strange Towers of Hanoi(递推)

Strange Towers of Hanoi Time Limit: 1000MS   Memory Limit: 30000K Total Submissions:...
  • WEYuLi
  • WEYuLi
  • 2013-07-18 11:06:48
  • 591

【poj1958】Strange Towers of Hanoi

Language: Default Strange Towers of Hanoi Time Limit: 1000MS   Memory Limit: 30000K ...
  • Joky_2002
  • Joky_2002
  • 2018-02-06 22:08:06
  • 30

Codeforces 626C Block Towers 【二分】

C. Block Towers time limit per test 2 seconds memory limit per test 256 megabytes input standa...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2016-02-14 16:54:15
  • 480

CodeForces 478D-Red-Green Towers

题目 D. Red-Green Towers time limit per test 2 seconds memory limit per test 256 me...
  • Druning
  • Druning
  • 2016-07-11 18:12:13
  • 524

codeforces 739c Alyona and towers

题意给定一个序列,求最长的严格先递增后递减区间长度。有m次区间加修改,每次修改后输出答案。 思路线段树。diff[i] = a[i] - a[i - 1],diff[1] = 0.这样每次的区间加就就...
  • highkill
  • highkill
  • 2016-12-01 15:38:43
  • 532

D. Red-Green Towers(Codeforces Round #273)

D. Red-Green Towers time limit per test 2 seconds memory limit per test 256 megabytes ...
  • caduca
  • caduca
  • 2014-10-17 11:35:10
  • 1808

CodeForces-626C-Block Towers

Description Students in a class are making towers of blocks. Each student makes a (non-zero) towe...
  • Ypopstar
  • Ypopstar
  • 2016-03-26 20:13:11
  • 466

线段树 codeforces Alyona and towers 739C

今天在CF上面看到一个题目,是有关线段树的。好久没有写过线段树,基本都已经忘完。没办法,后来只得看了网上的题解。写下这篇博客,总结一下线段树的操作,便于以后学习,复习。线段树主要树用来维护区间信息,快...
  • zyjhtutu
  • zyjhtutu
  • 2016-12-16 19:09:52
  • 310
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 2339
    排名: 1万+
    最新评论