`
scott________
  • 浏览: 21585 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
最近访客 更多访客>>
社区版块
存档分类
最新评论

hdoj 1207 汉诺塔II dp 动态规划

阅读更多

题目描述: http://acm.hdu.edu.cn/showproblem.php?pid=1207(中文)

题目分析:
以下思路转自:http://yxq0620.blog.163.com/blog/static/4449439220102245168595/

初看很难,理解了会发现真的很简单的...

不明白的建议看一下 http://poj.org/problem?id=1958这题,里面有dp 的思路.

如果不明白就继续看吧. 

dp[n]表示 将n个盘子通过4根柱子移动到目的柱子的最小的步数, f( i )表示 把 i个盘子通过 3根柱子移动到目的柱子的最小步数,f(i) 题目已经给出.

dp[ n ] =min(dp[ i ] * 2 + f(n - i));

dp[n]可以通过状态转移方程写出来,或许有的人看了状态转移方程,觉得很难想到,或者看不懂这个方程的意思,我来说说我自己的理解...

要将n各盘子移动到目的的柱子, 而要求最小的步数,所以先 将上面的k个盘子 通过4根柱子移动到 不是目的柱子和开始柱子的另外两个柱子的其中一个. 然后, 现在除了开始的柱子以外,剩下空的柱子就只有2根了. 所以就将剩下的 n-k个柱子通过3根柱子来移动到目地柱子, 最后 将开始 上面的k各盘子 通过4根柱子移动到目的柱子上面,

(1<=k<n);

所以状态转移方程就是这个样子

#include <iostream>
using namespace std;

int main() {
    unsigned long long step[65];
    unsigned long long f[65];
    f[1] = 1;
    unsigned long long i,j,min,cur,t = 1;
    for(i = 2; i < 64; i++)  //注意:只处理到i = 63
        f[i] = (t << i) - 1;//f[i] = (int)(pow(2, i) - 1);
    //f[i] = 2 * f[i - 1] + 1;

    step[0] = 0;
    step[1] = 1;
    step[2] = 3;
    for(i = 3; i <= 64; i++) {
        min = 0xffffffffffffffffUUL;  //UUL 表示unsigned long long, 我的g++ 不加UUL能过, 提交的时候却总是CE, 加上UUL, AC, 其实min 大于18433 就行
			
        for(j = 1; j < i; j++) {
            cur = 2 * step[j] + f[i - j];
            if(cur < min)
                min = cur;
        }
        step[i] = min;
    }
    int n;
    while(cin>>n)
        cout<<step[n]<<endl;
    return 0;
}


注意:
1. 只用long long 或是 __int64 计算过程会溢出, 所以要加unsigned
2. 由于用unsigned long long, 编译器要选g++
3. 有大牛发现以下规律, 所以该题不用dp 也能AC
规律:
step[1]=1;
step[2]=step[1]+2; step[3]=step[2]+2;(2个加2^1)
step[4]=a[3]+4; step[5]=step[4]+4; step[6]=step[5]+4;(3个加2^2);
…………………………………………(4个加2^3);
O(∩_∩)O~

分享到:
评论

相关推荐

    汉诺塔问题汉诺塔问题

    汉诺塔问题,源于印度古老传说,是一种经典的递归算法问题。它涉及到三根柱子和一堆盘子,目标是将所有盘子从第一根柱子(A)移动到第三根柱子(C),但每次只能移动一个盘子,并且任何时候大盘子都不能位于小盘子之...

    HDOJ DP题目总结

    一些HDOJ上的DP题目的小总结,但愿能帮到那些想专攻DP的人吧

    HDOJ题目分类 HDOJ题目分类

    2. **算法类型**:包括排序(冒泡、快速、归并等)、搜索(深度优先、广度优先、二分查找等)、动态规划、贪心算法、回溯、图论(最小生成树、最短路径等)等。 3. **数据结构**:数组、链表、栈、队列、树(二叉树...

    动态规划 dp ppt

    动态规划(Dynamic Programming,简称DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相互重叠的子问题来求解复杂问题的方法。动态规划的主要思想是将一个问题分解成多个阶段,每个阶段都有一个...

    hdoj.rar_Dividing HDOJ_OJ 1082_hdoj 10_杭电oj_杭电oj1000

    1. **算法与数据结构**:每个题目可能涉及到不同的算法,例如排序、搜索、图论、动态规划等,以及相应数据结构如栈、队列、链表、树等的应用。 2. **编程语言应用**:代码可能用C、C++、Java或Python等编程语言实现...

    HDOJ 80题 Java

    这意味着这些题目可能涵盖了从基础到高级的各种难度,包括但不限于排序、搜索、图论、动态规划、字符串处理、递归等常见算法主题。 在【压缩包子文件的文件名称列表】中,我们看到" HDOJ80 "这个文件,这可能是一个...

    ACM HDOJ 课件

    3. **动态规划**:动态规划是一种通过将大问题分解为小问题来求解的方法,通常用于优化问题。课件中可能包含最短路径、背包问题、矩阵链乘法等经典案例,学习动态规划能帮助解决许多复杂的多阶段决策问题。 4. **...

    HDOJ1002

    ACM ICPC HDOJ1002

    HDOJ1001

    ACM ICPC HDOJ1001

    HDOJ离线版

    1. **学习算法与数据结构**:HDOJ包含了丰富的算法题目,如排序、搜索、图论、动态规划、贪心算法等,是学习和提升算法能力的理想平台。通过解决这些题目,你可以深入理解各种算法的实际应用和性能分析。 2. **提高...

    hdoj1002——大整数相加

    - 虽然本题不涉及传统意义上的动态规划,但在处理大整数时,采用了一种类似于动态规划的思想。具体来说,是通过对每一位进行处理并记录进位的方式来模拟加法操作。 3. **数组与循环:** - 程序中定义了一个足够...

    hdoj1001标程

    hdoj1001标程

    Humble Numbers 简单DP

    【标题解析】:“Humble Numbers 简单DP”这个标题指的是一个与“Humble Numbers”相关的编程问题,它可以通过动态规划(Dynamic Programming, DP)方法来解决。Humble Numbers,也称为卑微数,是一类特殊的自然数,...

    HDOJ部分简单题(JAVA)

    HDOJ1000.java HDOJ1001.java HDOJ1089.java HDOJ1090.java HDOJ1091.java HDOJ1092.java HDOJ1093.java HDOJ1094.java HDOJ1095.java HDOJ1108.java HDOJ1406.java HDOJ2001.java HDOJ2002.java HDOJ2003.java HDOJ...

    hdoj1004 解题代码 答案

    hdoj1004,解题代码,答案代码,欢迎下载

    HDOJ1003

    ACM ICPC HDOJ1003

    HDOJ 1008

    ACM ICPC HDOJ1008

    hdoj解题代码

    这些文件是针对“hdoj”(HDU Online Judge)在线编程竞赛平台的解题代码,涵盖了题目编号从1000到1050的若干题目。HDU Online Judge是一个用于训练和测试编程技能的系统,用户可以提交代码解决各种算法问题,并获取...

    HDOJ.rar_HD_HDOJ

    2. **动态规划**:解决最优化问题,例如斐波那契数列、背包问题、最长公共子序列等。 3. **图论**:包括最短路径算法(Dijkstra、Floyd-Warshall、Bellman-Ford)、拓扑排序、最小生成树(Prim、Kruskal)等。 4. **...

Global site tag (gtag.js) - Google Analytics