我对状态空间的理解:https://www.cnblogs.com/AKMer/p/9622590.html

题目传送门:http://poj.org/problem?id=1958

题目要我们求四柱汉诺塔的步数最小值,将盘子数在\(1\)到\(12\)之间的全部求出来。

状态空间即为移动盘子对应的步数。

对于三柱汉诺塔,相信大家都非常熟悉了。我们假设三柱汉诺塔上有\(n\)个盘子,\(f[n]\)表示将\(n\)个盘子移动到另一根柱子上的最小步数,那么显然:

\(f[n]=f[n-1]*2+1\)

就相当于你先把上面\(n-1\)个盘子先移到第二跟柱子上,然后用一步把最后的大盘子移动到第三根柱子上。再把那\(n-1\)个盘子移到第三根柱子上。

那么在题目要求的四柱条件下,状态就可以用三柱条件下的状态扩展得来。设\(g[n]\)表示四柱条件下\(n\)个盘子从第一根全部移到另一根的最小步数。

那么显然:

\(g[n]=min\){\(\sum_{i=1}^{n-1}g[i]*2+g[n-i]\)}

就是枚举先将\(i\)个盘子移动到另一根柱子上,然后将剩下的盘子在三柱条件下移动到最后一根柱子上,再将先前的\(i\)根柱子移动到最后一根柱子上去。

时间复杂度:\(O(n^2)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; int n=12;
int f[13],g[13]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} int main() {
memset(g,63,sizeof(g));
g[1]=1;
for(int i=1;i<=n;i++)
f[i]=f[i-1]*2+1;
for(int i=2;i<=n;i++)
for(int j=1;j<i;j++)
g[i]=min(g[i],g[j]*2+f[i-j]);
for(int i=1;i<=n;i++)
printf("%d\n",g[i]);
return 0;
}

POJ1958:Strange Towers of Hanoi的更多相关文章

  1. POJ1958 Strange Towers of Hanoi [递推]

    题目传送门 Strange Towers of Hanoi Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 3117   Ac ...

  2. POJ-1958 Strange Towers of Hanoi(线性动规)

    Strange Towers of Hanoi Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 2677 Accepted: 17 ...

  3. POJ 1958 Strange Towers of Hanoi

    Strange Towers of Hanoi Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3784 Accepted: 23 ...

  4. POJ 1958 Strange Towers of Hanoi 解题报告

    Strange Towers of Hanoi 大体意思是要求\(n\)盘4的的hanoi tower问题. 总所周知,\(n\)盘3塔有递推公式\(d[i]=dp[i-1]*2+1\) 令\(f[i ...

  5. poj1958——Strange Towers of Hanoi

    The teacher points to the blackboard (Fig. 4) and says: "So here is the problem: There are thre ...

  6. poj1958 strange towers of hanoi

    说是递推,其实也算是个DP吧. 就是4塔的汉诺塔问题. 考虑三塔:先从a挪n-1个到b,把最大的挪到c,然后再把n-1个从b挪到c,所以是 f[i] = 2 * f[i-1] + 1; 那么4塔类似: ...

  7. Strange Towers of Hanoi

    题目链接:http://sfxb.openjudge.cn/dongtaiguihua/E/ 题目描述:4个柱子的汉诺塔,求盘子个数n从1到12时,从A移到D所需的最大次数.限制条件和三个柱子的汉诺塔 ...

  8. Gym-100451B:Double Towers of Hanoi

    题目链接 题目大意:把汉诺双塔按指定顺序排好的最少步数 我写这题写了很久...终于发现不dp不行 把一个双重塔从一根桩柱移动到另一根桩柱需要移动多少次? 最佳策略是移动一个双重 (n-1) 塔,接着移 ...

  9. Strange Towers of Hanoi POJ - 1958(递推)

    题意:就是让你求出4个塔的汉诺塔的最小移动步数,(1 <= n <= 12) 那么我们知道3个塔的汉诺塔问题的解为:d[n] = 2*d[n-1] + 1 ,可以解释为把n-1个圆盘移动到 ...

随机推荐

  1. Python闲谈(二)聊聊最小二乘法以及leastsq函数

    1 最小二乘法概述 自从开始做毕设以来,发现自己无时无刻不在接触最小二乘法.从求解线性透视图中的消失点,m元n次函数的拟合,包括后来学到的神经网络,其思想归根结底全都是最小二乘法. 1-1 “多线→一 ...

  2. java List的相关工具类

    1. <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</ar ...

  3. js apply / call 函数

    这两个函数的作用是: 将函数绑定到另外一个对象上去运行 用call和apply应用另一个函数(类)以后,当前的函数(类)就具备了另一个函数(类)的方法或是属性,这也能够称之为“继承”. functio ...

  4. TextView属性

    TextView及其子类,当字符内容太长显示不下时可以省略号代替未显示的字符:省略号可以在显示区域的起始,中间,结束位置,或者以跑马灯的方式显示文字(textview的状态为被选中). 其实现只需在x ...

  5. ubuntu service XXX start启动报start: Rejected send message, 1 matche

    service cron restart命令报错如下: stop: Rejected send message, 1 matched rules; type="method_call&quo ...

  6. iOS 展示 gif

    gif 图 是多张依次有连续动作的图 顺时间展示的一种动态效果图 .   有的是均匀时间更换下一张  有的 则不是均匀时间变化 1. 那么 对于均匀 时间变化的gif图 比较适合 使用 iOS 系统自 ...

  7. vim编辑器常规配置

    为了很舒服的编写程序,请把vim配置好 # apt install vim    安装vim编辑器 #sudo vim /etc/vim/vimrc   ///必须加上权限sudo 在这个文件中,会有 ...

  8. import from 'xxx'是如何找到node_modules目录下的

    起初我认为这是ES6或者Webpack的语法,但查阅相关API后并没有相关说明,通过进一步地搜索,才知道这是Node模块系统的约定和实现(Webpack打包工具是兼容node模块系统的,自然遵守相关规 ...

  9. nginx 搭建虚拟主机

    一.排错三部曲 第一步在客户端上ping服务端ip  ping 10.0.0.8 第二部在客户端上telnet服务器端IP.端口  telnet 10.0.0.8 第三部在客户端使用wget命令检测 ...

  10. EntityFramework 学习 一 Entity Framework 查询设计

    First/FirstOrDefault: using (var ctx = new SchoolDBEntities()) { var student = (from s in ctx.Studen ...