题目描述: 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~
发表评论
-
ACM 之 Java BigInteger
2011-06-01 20:26 0Java 的大整数类在ACM 中大有用武之地 ... -
判断点是否构成多边形, 顶点连续给出
2011-05-26 14:27 0#include <cstdio> #inc ... -
poj pku 1981 Circle and Points 点与圆 位置关系
2011-05-26 11:29 1315题目描述: http://poj.org/problem?id ... -
poj 1032 Parliament 数学
2011-05-25 17:34 1258题目描述: http://poj.org/problem?i ... -
poj 1385 Lifting the Stone 多边形重心
2011-05-25 11:13 1091题目描述: http://poj.org/problem?i ... -
poj 2676 Sudoku dfs 深搜
2011-05-16 21:05 906题目描述: http://poj.org/problem?i ... -
hdoj 2064 汉诺塔III 递推
2011-05-15 22:29 936题目描述: http://acm.hdu.edu.cn/sh ... -
poj 2506 Tiling 递推
2011-05-15 11:18 967题目描述: http://poj.org/problem?i ... -
poj 2420 A Star not a Tree? 多边形 费马点
2011-05-14 18:57 1854题目描述: http://poj.org/problem?i ... -
poj 2954 Triangle Pick 定理
2011-05-14 16:36 1223题目描述: http://poj.org/problem?i ... -
poj 1012 Joseph
2011-05-10 17:42 1290题目描述:poj.org/problem?id=10 ... -
zoj 1081 Points Within 点与多边形关系
2011-05-07 17:51 1190题目描述: http://acm.zju.edu.cn/on ... -
poj 1835 宇航员
2011-05-03 17:00 874题目描述:http://poj.org/problem?id ... -
poj 2398 Toy Storage
2011-04-23 20:19 757题目描述:http://www.poj.org/proble ... -
poj 1654 Area 多边形面积
2011-04-23 20:10 970题目描述:http://poj.org/proble ... -
poj 2318 TOYS 点 直线 位置关系
2011-04-23 10:06 736题目描述:http://poj.org/problem?id= ... -
poj pku 1673 EXOCENTER OF A TRIANGLE 三角形 垂心
2011-04-09 16:41 592题目描述:http://poj.org/problem?id= ... -
pc 111303 uva 10195 The Knights Of The Round Table
2011-04-04 16:06 789题目描述:http://www.programming-cha ... -
pc 111302 uva 10180 Rope Crisis in Ropeland!
2011-04-03 20:46 882题目描述: http://www.programming-ch ... -
poj 1971 Parallelogram Counting 平行四边形个数
2011-04-03 10:05 1256题目描述:http://poj.org/problem?id= ...
相关推荐
汉诺塔问题,源于印度古老传说,是一种经典的递归算法问题。它涉及到三根柱子和一堆盘子,目标是将所有盘子从第一根柱子(A)移动到第三根柱子(C),但每次只能移动一个盘子,并且任何时候大盘子都不能位于小盘子之...
一些HDOJ上的DP题目的小总结,但愿能帮到那些想专攻DP的人吧
动态规划是一种解决问题的有效方法,尤其在处理具有重叠子问题和最优子结构的复杂问题时。本讲义主要探讨动态规划的基本思想、方法及其在ACM(国际大学生程序设计竞赛)中的应用。 首先,让我们来看一个例子:计算...
2. **算法类型**:包括排序(冒泡、快速、归并等)、搜索(深度优先、广度优先、二分查找等)、动态规划、贪心算法、回溯、图论(最小生成树、最短路径等)等。 3. **数据结构**:数组、链表、栈、队列、树(二叉树...
动态规划(Dynamic Programming,简称DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相互重叠的子问题来求解复杂问题的方法。动态规划的主要思想是将一个问题分解成多个阶段,每个阶段都有一个...
1. **算法与数据结构**:每个题目可能涉及到不同的算法,例如排序、搜索、图论、动态规划等,以及相应数据结构如栈、队列、链表、树等的应用。 2. **编程语言应用**:代码可能用C、C++、Java或Python等编程语言实现...
这意味着这些题目可能涵盖了从基础到高级的各种难度,包括但不限于排序、搜索、图论、动态规划、字符串处理、递归等常见算法主题。 在【压缩包子文件的文件名称列表】中,我们看到" HDOJ80 "这个文件,这可能是一个...
3. **动态规划**:动态规划是一种通过将大问题分解为小问题来求解的方法,通常用于优化问题。课件中可能包含最短路径、背包问题、矩阵链乘法等经典案例,学习动态规划能帮助解决许多复杂的多阶段决策问题。 4. **...
ACM ICPC HDOJ1002
ACM ICPC HDOJ1001
1. **学习算法与数据结构**:HDOJ包含了丰富的算法题目,如排序、搜索、图论、动态规划、贪心算法等,是学习和提升算法能力的理想平台。通过解决这些题目,你可以深入理解各种算法的实际应用和性能分析。 2. **提高...
hdoj1001标程
- 虽然本题不涉及传统意义上的动态规划,但在处理大整数时,采用了一种类似于动态规划的思想。具体来说,是通过对每一位进行处理并记录进位的方式来模拟加法操作。 3. **数组与循环:** - 程序中定义了一个足够...
【标题解析】:“Humble Numbers 简单DP”这个标题指的是一个与“Humble Numbers”相关的编程问题,它可以通过动态规划(Dynamic Programming, DP)方法来解决。Humble Numbers,也称为卑微数,是一类特殊的自然数,...
hdoj1004,解题代码,答案代码,欢迎下载
ACM ICPC HDOJ1003
ACM ICPC HDOJ1008
这些文件是针对“hdoj”(HDU Online Judge)在线编程竞赛平台的解题代码,涵盖了题目编号从1000到1050的若干题目。HDU Online Judge是一个用于训练和测试编程技能的系统,用户可以提交代码解决各种算法问题,并获取...
2. **动态规划**:解决最优化问题,例如斐波那契数列、背包问题、最长公共子序列等。 3. **图论**:包括最短路径算法(Dijkstra、Floyd-Warshall、Bellman-Ford)、拓扑排序、最小生成树(Prim、Kruskal)等。 4. **...
“hdoj杭电1000-2000部分解题报告”这个标题指的是一个关于杭州电子科技大学(简称杭电)在线编程竞赛平台(HDU Online Judge,简称HDOJ)上的题目解题报告。这份报告涵盖了编号从1000到2000的题目,这是一段相当大...