题目描述: 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 1294题目描述: http://poj.org/problem?id ... -
poj 1032 Parliament 数学
2011-05-25 17:34 1243题目描述: http://poj.org/problem?i ... -
poj 1385 Lifting the Stone 多边形重心
2011-05-25 11:13 1069题目描述: http://poj.org/problem?i ... -
poj 2676 Sudoku dfs 深搜
2011-05-16 21:05 902题目描述: http://poj.org/problem?i ... -
hdoj 2064 汉诺塔III 递推
2011-05-15 22:29 919题目描述: http://acm.hdu.edu.cn/sh ... -
poj 2506 Tiling 递推
2011-05-15 11:18 948题目描述: http://poj.org/problem?i ... -
poj 2420 A Star not a Tree? 多边形 费马点
2011-05-14 18:57 1831题目描述: http://poj.org/problem?i ... -
poj 2954 Triangle Pick 定理
2011-05-14 16:36 1181题目描述: http://poj.org/problem?i ... -
poj 1012 Joseph
2011-05-10 17:42 1270题目描述:poj.org/problem?id=10 ... -
zoj 1081 Points Within 点与多边形关系
2011-05-07 17:51 1174题目描述: http://acm.zju.edu.cn/on ... -
poj 1835 宇航员
2011-05-03 17:00 849题目描述:http://poj.org/problem?id ... -
poj 2398 Toy Storage
2011-04-23 20:19 747题目描述:http://www.poj.org/proble ... -
poj 1654 Area 多边形面积
2011-04-23 20:10 940题目描述:http://poj.org/proble ... -
poj 2318 TOYS 点 直线 位置关系
2011-04-23 10:06 706题目描述:http://poj.org/problem?id= ... -
poj pku 1673 EXOCENTER OF A TRIANGLE 三角形 垂心
2011-04-09 16:41 579题目描述:http://poj.org/problem?id= ... -
pc 111303 uva 10195 The Knights Of The Round Table
2011-04-04 16:06 779题目描述:http://www.programming-cha ... -
pc 111302 uva 10180 Rope Crisis in Ropeland!
2011-04-03 20:46 868题目描述: http://www.programming-ch ... -
poj 1971 Parallelogram Counting 平行四边形个数
2011-04-03 10:05 1244题目描述:http://poj.org/problem?id= ...
相关推荐
汉诺塔问题,源于印度古老传说,是一种经典的递归算法问题。它涉及到三根柱子和一堆盘子,目标是将所有盘子从第一根柱子(A)移动到第三根柱子(C),但每次只能移动一个盘子,并且任何时候大盘子都不能位于小盘子之...
一些HDOJ上的DP题目的小总结,但愿能帮到那些想专攻DP的人吧
2. **算法类型**:包括排序(冒泡、快速、归并等)、搜索(深度优先、广度优先、二分查找等)、动态规划、贪心算法、回溯、图论(最小生成树、最短路径等)等。 3. **数据结构**:数组、链表、栈、队列、树(二叉树...
动态规划(Dynamic Programming,简称DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相互重叠的子问题来求解复杂问题的方法。动态规划的主要思想是将一个问题分解成多个阶段,每个阶段都有一个...
1. **算法与数据结构**:每个题目可能涉及到不同的算法,例如排序、搜索、图论、动态规划等,以及相应数据结构如栈、队列、链表、树等的应用。 2. **编程语言应用**:代码可能用C、C++、Java或Python等编程语言实现...
这意味着这些题目可能涵盖了从基础到高级的各种难度,包括但不限于排序、搜索、图论、动态规划、字符串处理、递归等常见算法主题。 在【压缩包子文件的文件名称列表】中,我们看到" HDOJ80 "这个文件,这可能是一个...
3. **动态规划**:动态规划是一种通过将大问题分解为小问题来求解的方法,通常用于优化问题。课件中可能包含最短路径、背包问题、矩阵链乘法等经典案例,学习动态规划能帮助解决许多复杂的多阶段决策问题。 4. **...
ACM ICPC HDOJ1002
ACM ICPC HDOJ1001
1. **学习算法与数据结构**:HDOJ包含了丰富的算法题目,如排序、搜索、图论、动态规划、贪心算法等,是学习和提升算法能力的理想平台。通过解决这些题目,你可以深入理解各种算法的实际应用和性能分析。 2. **提高...
- 虽然本题不涉及传统意义上的动态规划,但在处理大整数时,采用了一种类似于动态规划的思想。具体来说,是通过对每一位进行处理并记录进位的方式来模拟加法操作。 3. **数组与循环:** - 程序中定义了一个足够...
hdoj1001标程
【标题解析】:“Humble Numbers 简单DP”这个标题指的是一个与“Humble Numbers”相关的编程问题,它可以通过动态规划(Dynamic Programming, DP)方法来解决。Humble Numbers,也称为卑微数,是一类特殊的自然数,...
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,解题代码,答案代码,欢迎下载
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. **...