链接:http://poj.org/problem?id=1958

大意:汉诺塔升级版,四根柱子,n个盘子,求最少移动次数;

两种方法 递推or递归(当然还有思路3——打表)

思路1:递推(或者DP?)

把四塔转换为三塔进行思考

假设当前要移动n个盘子,那么就不如分为以下几步

先将上面的i个盘子移到第2或3个塔上;(四塔移动)

再把剩下的(n-i)个盘子移到最后一个塔上(三塔移动);

最后把在那i个盘子移到最后一个塔上(注意:是四塔移动,i个盘子一定比后来的(n-i)个盘子小)

得到方程:f[n]=min{2*f[i]+d[n-i]};

注:f[i]为四塔移动的最小步数,d[i]为三塔移动的最小步数(此处不再多说,都知道是2^i-1了,由于题面要求12,打表就行,由于两次四塔移动,一次三塔移动,所以F[N]*2)

核心代码:

for(int i=1;i<=n;i++)
{
f[n]=min(f[n],2*f[i]+d[n-i]);
}

AC代码

#include<cstdio>
#include<iostream>
#include<cctype>
#include<algorithm>
using namespace std; inline int read()
{
int ans=0,f=1;
char chr=getchar();
while(!isdigit(chr)) {if(chr='-') f=-1; chr=getchar();}
while(isdigit(chr)) {ans=ans*10+chr-'0'; chr=getchar();}
return ans*f;
}//没有读入,依然要坚持加上/笑哭
int f[20]={0};
int d[]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095};
int main()
{
int n=1;
f[1]=1;
f[2]=3;
for(n;n<=12;n++)
{
if(f[n])
{
printf("%d\n",f[n]);
continue;
}
f[n]=0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
f[n]=min(f[n],2*f[i]+d[n-i]);
}
printf("%d\n",f[n]);
}
return 0;
}

思路2:递归

总体思路一模一样,实现有区别而已;

#include<cstdio>
#include<iostream>
#include<cctype>
#include<cstring>
#include<algorithm>
using namespace std; inline int read()
{
int ans=0,f=1;
char chr=getchar();
while(!isdigit(chr)) {if(chr='-') f=-1; chr=getchar();}
while(isdigit(chr)) {ans=ans*10+chr-'0'; chr=getchar();}
return ans*f;
}
int f[20];
int d[]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095};
int hanoi(int x)
{
if(f[x])
return f[x];//记忆化(这个算吗/晕)
if(x==0)
return 0;
if(x==1)
return f[1]=1;
f[x]=0x3f3f3f3f;
for(int i=1;i<x;i++)
f[x]=min(f[x],2*hanoi(i)+d[x-i]);//方程;
return f[x];
} int main()
{
memset(f,0,sizeof(f));
hanoi(12);
for(int i=1;i<=12;i++)
printf("%d\n",f[i]);
return 0;
}

思路3:打表(hmmmm)

可以说是最快的思路了

#include<cstdio>
#include<iostream>
#include<cctype>
#include<algorithm>
using namespace std; inline int read()
{
int ans=0,f=1;
char chr=getchar();
while(!isdigit(chr)) {if(chr='-') f=-1; chr=getchar();}
while(isdigit(chr)) {ans=ans*10+chr-'0'; chr=getchar();}
return ans*f;
}
int f[]={0,1,3,5,9,13,17,25,33,41,49,65,81};
int main()
{
for(int i=1;i<=12;i++)
printf("%d\n",f[i]);
return 0;
}

poj1958-汉诺四塔问题(三种方法)的更多相关文章

  1. 像画笔一样慢慢画出Path的三种方法(补充第四种)

    今天大家在群里大家非常热闹的讨论像画笔一样慢慢画出Path的这种效果该如何实现. 北京-LGL 博客号@ligl007发起了这个话题.然后各路高手踊跃发表意见.最后雷叔 上海-雷蒙 博客号@雷蒙之星 ...

  2. JavaScript进阶(四)js字符串转换成数字的三种方法

    js字符串转换成数字的三种方法 在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b. ...

  3. Linux启动新进程的三种方法

    程序中,我们有时需要启动一个新的进程,来完成其他的工作.下面介绍了三种实现方法,以及这三种方法之间的区别. 1.system函数-调用shell进程,开启新进程system函数,是通过启动shell进 ...

  4. java 获取随机数的三种方法

    方法1(数据类型)(最小值+Math.random()*(最大值-最小值+1))例:(int)(1+Math.random()*(10-1+1))从1到10的int型随数 方法2获得随机数for (i ...

  5. 在 C# 中,(int) ,Int32.Parse() 和 Convert.toInt32() 三种方法的区别

    在 C# 中,(int),Int32.Parse() 和 Convert.toInt32() 三种方法有何区别? int 关键字表示一种整型,是32位的,它的 .NET Framework 类型为 S ...

  6. MySQL提供了以下三种方法用于获取数据库对象的元数据

    MySQL提供了以下三种方法用于获取数据库对象的元数据: 1)show语句 2)从INFORMATION_SCHEMA数据库里查询相关表 3)命令行程序,如mysqlshow, mysqldump 用 ...

  7. Java/JSP获得客户端网卡MAC地址的三种方法解析

    java/jsp获得客户端(IE)网卡MAC地址的方法大概有三种. 1.通过命令方式,在客户端执行Ipconfig 等等.(java/jsp) 2.通过ActiveX的方法.(jsp) 3.通过向13 ...

  8. Javascript 创建对象的三种方法及比较【转载+整理】

    https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Inheritance_and_the_prototype_chain 本文内容 引 ...

  9. Ubuntu Linux系统三种方法添加本地软件库

    闲着没事教教大家以Ubuntu Linux系统三种方法添加本地软件库,ubuntu Linux使用本地软件包作为安装源——转2007-04-26 19:47新手重新系统的概率很高,每次重装系统后都要经 ...

  10. Oracle数据库备份与恢复的三种方法

    转自blueskys567原文Oracle数据库备份与恢复的三种方法, 2006-10. 有删改 Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP).热备份和冷备份. 导出 ...

随机推荐

  1. Java切换JDK版本的方法及技巧

    由于项目的不同安排,之前项目开发时,使用的jdk版本为1.8,现临时接手一以前项目,需要更换jdk版本. 安装 不再赘述,去Oracle网站(https://www.oracle.com/techne ...

  2. CAD调用导角命令,并返回导角的圆弧对象

    主要用到函数说明: _DMxDrawX::SendStringToExecuteFun 把命令当着函数执行,可以传参数,详细说明如下: 参数 说明 IDispatch* pParam 命令参数,IMx ...

  3. Vova and Trophies CodeForces - 1082B(思维题)

    Vova has won nn trophies in different competitions. Each trophy is either golden or silver. The trop ...

  4. python中zip( )的使用

    zip函数简单用法 x = [1, 2, 3] y = [4, 5, 6] z = [7, 8, 9] xyz = zip(x,y,z) #得到一个zip对象 xyz #打印结果为<zip ob ...

  5. Scrapy实战:使用IDE工具运行爬虫

    一般我们运行爬虫程序都是使用命令行,比如:scrapy crwal sobook.不过这多少有些不方便,可以使用下面的方法使用IDE的方式运行爬虫 我这边使用的是pycharm软件,在pycharm里 ...

  6. R 安装car包失败

    在RStudio里安装car包的时候报错 /usr/bin/ld: cannot find -llapack /usr/bin/ld: cannot find -lblas make: *** [qu ...

  7. LINQ简记(2):重要概念

    为了能让初学者更快速地掌握,在系列文章中,我尽可能地避开理论讲解,一则对于入门者来说,过多的理论叙述反而会降低大家学习编程的兴趣,二则,官方文档的资料很详细,我说了也是废话.因此,我会尽可能地多举些简 ...

  8. 关于框架搭建-web

    最近一直在学习前端相关的东西,在学了一堆基础可以以及动手在某个前端框架上写了一些东西之后,我想尝试着开始自己搭建一个框架.不知道时间需要多久,但会持续更新.小菜鸟的成长记录. ------------ ...

  9. 【Codeforces 1114D】Flood Fill

    [链接] 我是链接,点我呀:) [题意] 你选择一个point作为start_position 然后每次你可以将包含该start_position的所有联通块变成任意颜色 问你最少要多少次变换才能将所 ...

  10. 关于单CPU,多CPU上的原子操作

    所谓原子操作,就是"不可中断的一个或一系列操作" . 硬件级的原子操作:在单处理器系统(UniProcessor)中,能够在单条指令中完成的操作都可以认为是" 原子操作& ...