07 2011 档案

排列的分解
摘要:离散数学里面大家都学过群,群里面有种很基本并且很重要的叫做置换群,置换群的元素本质上就是一个排列(英文 permutation group, 直译过来应该是排列群)。大家应该都学过当初要把 (4 1 5 2 3) 分解成 (1 4 2)(3 5),这个叫做群的 k-cycle 分解,也就是说,一个排列(置换群的一个元素)可以分解成多个 k-cycle。所以,现在问题就是:给定一个[1, n] 构成的排列,求这个排列的 k-cycle 分解,即输出每个 k-cycle,允许使用 O(n) 的额外空间。这实际上是一个循环链表问题:// 为了更贴近前文所述,a 的长度是 n+1,a[0] 未用,a[ 阅读全文

posted @ 2011-07-23 16:44 能发波 阅读(297) 评论(0) 推荐(0)

穷举搜索
摘要:对于一些困难的问题,我们只能穷举(brut force)搜索,是的,我们知道“穷举搜索”这个词,可是,具体怎么穷举呢?很多问题可以归结到图的搜索,对于图的搜索,大家应该都知道 DFS 和 BFS,然而可能没有多少人知道如何对图做穷举搜索。我先举一个最简单的例子:哈米尔顿环(hamilton cycle),不知道的,可以去维基百科上去查。#include #include #include #include #include using namespace std;int start = 0;int N;vector > G;vector P; // current path/stackv 阅读全文

posted @ 2011-07-17 15:58 能发波 阅读(303) 评论(0) 推荐(0)

第一个博弈程序
摘要:甲乙两人在玩一个游戏:一堆小石子,共n个,每次每人可以从中取1个,或2个,或4个,甲先开始,最后取的那个人输(不管他去1个,还是2个,还是4个)。但是呢,甲乙两个人都是智力超群的天才,他们总会使用对自己有利的策略。问题:我们能否从一开始就知道谁必然赢?可以这样考虑:如果只剩下1,2,3,4个石子时,轮到 x 取,我们可以推断出那个必然的赢家。1x 输2x 赢(x 取 1 个)3x 赢(x 取 2 个)4x 输(不管取 1,2,4 个都输)我们给甲乙编号,甲为 0,乙为 1,可以得到如下递归程序int winner(int n, int x) { assert(n >= 1); sw... 阅读全文

posted @ 2011-07-17 12:38 能发波 阅读(188) 评论(0) 推荐(0)

合并两个有序序列
摘要:经典写法合并两个有序序列,太简单了吧?还有专门讨论的必要吗?这是一个最简单的 Merge 版本:templatevoid merge(InputIter1 first1, InputIter1 last1, InputIter2 first2, InputIter2 last2, OutputIter output) { for (; first1 != last1 && first2 != last2; ++output) { if (*first2 OutputItermerge_sort_loop(RandInputIter first, RandInputI... 阅读全文

posted @ 2011-07-16 16:37 能发波 阅读(235) 评论(0) 推荐(0)

Great Windows 7
摘要:Windows 7,打开“下载”文件夹,里面也就几十个文件……它非常“友好”地在地址栏部分显示一个进度条,等到进度条100%,右边文件夹内容部分变成非空白——文件显示出来,我可以去拉泡屎,再回来也不迟,我没有拉肚子,我便秘!这么恶心的东西,我可以不用它吗?如果网银,视频播放器有的选择!Ubuntu 也在发扬 Windows 的优良传统,公司的台式机硬件至少我这电脑落后3年,可是他的速度至少比 Ubuntu 快 3 倍,比 Windows 7 呢,300 倍吧!人家用的是精简版的 RedHat。是恐龙该灭绝的时候了! 阅读全文

posted @ 2011-07-13 23:01 能发波 阅读(126) 评论(0) 推荐(0)

枚举变量扩展-2
摘要:在前一篇文章里,可能有人注意到了:扩展结果中会出现同一变量的不同实例,如果我们要增加一个限制,扩展结果中每个变量都必须引用相同的实例,该怎么做? 阅读全文

posted @ 2011-07-03 16:26 能发波 阅读(91) 评论(0) 推荐(0)

导航