n-1原则

汉诺塔问题

徘徊边缘 提交于 2019-12-09 14:33:38
题目 :如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数 思路解析 :将 A 中的 n-1 个圆盘移到 C 中,再将 A 中的 n-1 个圆盘移到 B,再将 C 中的圆盘移到 B 上,再将 A 中的最下面的圆盘移到 C中,再 B 中的 n-1 个圆盘移到 A,再 B 中的 最下面 个圆盘移到 C,再移动 A 中的个圆盘移到 C(这里以n=3为例,建议画图) 代码实现 : public static void hanoid(int n,char a,char b,char c ) { if(n<=0) { return; } // 将上面的 n-1 个圆盘经由 C 移到 B hanoid(n-1,a,c,b); // 此时将 A 底下的那块最大的圆盘移到 C move(a,c); // 再将 B 上的 n-1 个圆盘经由 A 移到 C上 hanoid(n-1,b,a,c); } public static void move(char a, char b) { // TODO Auto-generated method stub System.out.println(a + "->" + b); } 结果展示 : 谢谢观看

算法详解--汉诺塔

て烟熏妆下的殇ゞ 提交于 2019-12-03 03:15:32
算法由来 小故事 汉诺塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市;1883年法国数学家Edouard Lucas曾提及这个故事,据说创世 纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根 石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。 我们来把这个故事变成一个算法: 把三个柱子标为ABC 如果只有一个盘子时,将它直接搬到c,当有两个盘子,就将B做为辅助。如果盘数超过2个,将第三个以下的盘子遮起来,就很简单了,每次处理两个盘子,也就是 A->B A->C B->C这三个步骤,而被遮住的部分是一个递归处理。如果有n个盘子,则移动完毕所需的次数为2^n-1。 如图: 事实上,若有n个盘子,则移动完毕所需之次数为2^n - 1,所以当盘数为64时,则所需次数为: 264- 1 = 18446744073709551615 为5.05390248594782e+16年,也就是约5000世纪,如果对这数字没什么概念,就假设每秒钟搬一个盘子好了,也要约5850亿年左右。

矩阵快速幂总结

匿名 (未验证) 提交于 2019-12-02 23:51:01
依然主要还是自用 首先矩阵一条性质的概述和证明 概述:对于一个临接矩阵$G$来说,它自乘$G^k$次方中$G[i][j]$含义为从i走到j走k步方案数. 证明:比较麻烦,我们设f[i]表示从1走到其他点方案数,那么根据矩阵递推优化,k次就是转移了k次,那么每次走一步,k次就是走了k步 最好手模一下,然后自己随便写一个数据验证一下. 然后矩阵可以优化递推,比如优化菲波纳契数列的递推,暴力递推时间复杂度是$O(n)$的用矩阵快速幂能优化成$8*log(n)$的 具体优化步骤, 首先把之前各项写出来, 先写出这一项可以由什么转移过来, 通过添加系数的方法把各项算出来 就拿菲波纳契数列为例 首先假设f矩阵为 $(f[n], f[n-1])$ 根据横乘竖的原则 得出$(f[n],f[n-1])$=$(f[n-1],f[n-2])\times$$\left(\begin{array}{cc}1&1\\1&0\end{array}\right)$ 主要还是横乘竖对应好就完了 一些题目 奶牛接力跑,迷路

20190817笨笨的套题

我怕爱的太早我们不能终老 提交于 2019-11-27 16:17:08
题 A \(DHOJ 1503\) 笨笨与电影票 B \(DHOJ 1506\) 笨笨玩糖果 C \(DHOJ 1506\) 笨笨玩糖果 正解 求出哪些是必胜态还是必败态 胜利要尽量快,失败要尽量慢 显而易见这道题是有一个博弈的背景的,那么根据博弈的那两个经典结论,只要能转移到一个必败态的就是必胜态,如果一个必败态都转移不到的就是比败态。 那么我们首先将0与1初始化为必败态,对于每一个数i,减去所有比i小的所有质数,如果有必败态即为必胜态,如果都转移不到就是必败态了。 接着再留心一下题目,题目要求至多x步,那么就是取得胜利的最多次数了。这样的话因为已经求出了哪个点是必胜态与必败态,我们也便可以推出转移方程: 如果这个状态i是必胜态,那么能转移到它的一定是比它小的j的必败态,因为知道自己会胜利,那么一定会选择其中的最小步数。 如果这个状态i是必败态,那么能转移到它的就是比它小的任意一个数了,因为知道自己会失败,那么一定会选择其中的最大步数。 这道题目最恶心的就是卡常数了。于此我使用了o(n)的素数筛来筛出质数,并同时处理出比i小的最大素数是第几个素数,这样能够尽量减少后期的枚举量,以便不被卡常 思路 没想到第二步 D \(DHOJ 1507\) 笨笨的宇宙蘑菇 原 题解 正解1 杨辉三角 卡特兰数, 重点就是无效序列失效后面的序列反转 高精度 ans就是C(n,[n/2]) 首先