`
scott________
  • 浏览: 21960 次
  • 性别: 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的人吧

    动态规划 dp 讲义(一)

    动态规划是一种解决问题的有效方法,尤其在处理具有重叠子问题和最优子结构的复杂问题时。本讲义主要探讨动态规划的基本思想、方法及其在ACM(国际大学生程序设计竞赛)中的应用。 首先,让我们来看一个例子:计算...

    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. **提高...

    hdoj1001标程

    hdoj1001标程

    hdoj1002——大整数相加

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

    Humble Numbers 简单DP

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

    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. **...

    hdoj杭电1000-2000部分解题报告

    “hdoj杭电1000-2000部分解题报告”这个标题指的是一个关于杭州电子科技大学(简称杭电)在线编程竞赛平台(HDU Online Judge,简称HDOJ)上的题目解题报告。这份报告涵盖了编号从1000到2000的题目,这是一段相当大...

Global site tag (gtag.js) - Google Analytics