hdu 1207 汉诺塔II 递推关系
来源:互联网 发布:知乎 日本人的遥远旅途 编辑:程序博客网 时间:2024/06/07 05:56
Description
Gardon是个怕麻烦的人(恩,就是爱偷懒的人),很显然将64个圆盘逐一搬动直到所有的盘子都到达第三个柱子上很困难,所以Gardon决定作个小弊,他又找来了一根一模一样的柱子,通过这个柱子来更快的把所有的盘子移到第三个柱子上。下面的问题就是:当Gardon在一次游戏中使用了N个盘子时,他需要多少次移动才能把他们都移到第三个柱子上?很显然,在没有第四个柱子时,问题的解是2^N-1,但现在有了这个柱子的帮助,又该是多少呢?
Input
Output
Sample Input
1312
Sample Output
1581
递推关系式为:F[n]=min{2*F[x]+2^(n-x)-1};
思路:
分为三步:
1.将x(1<=x<=n)个盘子经过b,d移到c柱子上;设需要f[x]步;
2.将n-x个盘子从a柱子经过b移到d柱子上(因为c柱子上都比a柱子上的小,所以此时不能依靠c柱子),此时是一个经典汉诺塔移动问题 可以推倒出需要2^(n-x)-1步;
3.将c柱子上的x个盘子经过a,b柱子移动到d上也需要 f[x]步;
所以综合起来关系式为 F[n]=2*F[x]+2^(n-x)-1;因为 F[n]的值随x的变化而变化,所以应该取最小值,直接循环遍历一下就行;
ac代码:
#include<stdio.h>#include<math.h>int f[70];void solve(){ f[1]=1; f[2]=3; for(int i=3;i<=64;i++) { int min=99999999; for(int m=1;m<i;m++) { if(2*f[m]+pow(2,i-m)-1<min) min=2*f[m]+pow(2,i-m)-1; } f[i]=min; } }int main(){ int n; solve(); while(scanf("%d",&n)!=EOF) { printf("%d\n",f[n]); } return 0;}
- hdu 1207 汉诺塔II 递推关系
- HDU 1207 汉诺塔II --递推
- hdu 1207 汉诺塔II 递推
- HDU 1207 汉诺塔II(递推)
- 递推:汉诺塔II
- hdu 2563 -统计问题 【递推关系】
- hdu 2563 -统计问题 【递推关系】
- HDU1207 汉诺塔II 【递推】
- 递推关系求解(HDU 2047+HDU 2045)
- 【递推】【DP】-HDU-1207-汉诺塔②
- HDOJ题目1207汉诺塔II(递推,易错)
- hdu 1165 Eddy's research II(数学题,递推)
- hdu 1165 Eddy's research II(递推+打表)
- HDU 1165 Eddy's research II(递推)
- 汉诺塔II(hdu1207)经典递推
- 汉诺塔II (递推+数学)
- HDU - 2501 - Tiling_easy version (简单递推关系!!)
- 递推关系之划分空间问题(hdu 1290&&2050)
- 设计模式六大原则
- CentOS python 2.x 升到 3.x 遇到的一些问题记录
- 网站建设的流程
- SQL语句大提升
- 客户端动态化系列之——Weex
- hdu 1207 汉诺塔II 递推关系
- Docker命令使用详解
- 第七周 项目5 排队看病模拟
- 第7周 项目2-建立链队算法库
- Python中执行系统命令常见方法
- LINUX 服务器 PHP与MYSQL中文乱码问题最终解决方案
- 图片文件如何转换成一个PDF文档
- ADO大总结
- APICloud从0开始写脉脉(3)顶部导航栏