算法竞赛进阶指南
★飞翔的企鹅★
有朝一日,这里会写不开!
展开
-
汉诺塔问题
汉诺塔规则如下:1、有三根相邻的柱子,标号为A,B,C。2、A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘。3、现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。这是一个递推问题,请先看2个盘子的情况:第一次可将上层的块移动到B上:第二次可将A上的块移动到C上:第三次再将B上的块移动到C上:这样就实现了题目的要求,下面看...原创 2020-03-29 23:23:10 · 1192 阅读 · 0 评论 -
费解的开关
本题可通过递推解决。其思路是这样的:由于每按一个灯就会导致上下左右的灯取反,所以如果想让当前某个灯变亮的话,决不能直接按它,而是通过下一行与它同列的灯间接使它变亮。第i+1行依赖于第 i 行的灯的情况,如果第 i 行是能递推通往正确结果(即全亮)的,那么该行为0的位,应该由第i+1行给调回来。所以第1行是一切的基础,需要对第一行灯按与不按(而不是亮与不亮)的32中情况逐一枚举,用二进制数...原创 2020-03-29 19:39:22 · 341 阅读 · 0 评论 -
递归实现排列组合
本题要求实现对n以内的整数进行排列组合(只选不排)。实现思路就是对于当前第u位数(u <= n),分为选与不选两种情况,构成了一棵二叉选择树,最终的叶节点就是答案。为了节省空间和简化操作,使用状态压缩,对于state,第i位为1表示i这个数被选中。#include<iostream>using namespace std;int n;void dfs(int u...原创 2020-03-27 21:19:55 · 1137 阅读 · 0 评论 -
最短Hamilton路径
本题如果使用暴搜的话会超时。因为是无向图,所以最终我们只关心不重不漏的一条路径的长度,而不关心内部先走哪个点后走哪个点。所以,我们需要对每个点进行位置标记,当然可以开一个visited数组记录,但为了操作简便以及空间复杂度,使用二进制位表示更为简便。某一位为1表示对应的该点被访问过。因此一个二进制数就代表了一种路径状态,...原创 2020-01-20 21:45:43 · 541 阅读 · 0 评论 -
快速幂
本题暴力解的话会超时。所应用的方法是快速幂,其主要思想是这样的:比如求3^73^1 = 3;3^2 = 9;3^3 = 27;这里的3^3不是暴力算出来的,我们已经算出来了3^1 = 3和3^2 = 9;所以两者相乘就是3^3。所以快速幂之所以快就是因为,它利用了前面的结果,避免了重复计算。下面我们需要考虑,怎么样才能让计算机知道现在要用前面的那些结果呢?我们以3^5为例讲解...原创 2020-01-11 22:36:44 · 219 阅读 · 0 评论