摘要: 对于生成n个数的排列,我们大家肯定都知道一种回朔的解法,这种解法就是根据8皇后得来的,当然,需要把冲突条件改一下就行.然而,我们现在要提的是另外一种方法,就是通过定义去写的一种算法. 显然,1的排列就是1;1,2的排列有1,2和2,1两个;现在我们考虑1,2,3这三个数的排列,显然,1,2,3这三个数的排列其实就是分以下三种情况: 1)把1放在第1位,剩下的就是2,3的两个数排列 2)把2放在第1位,剩下的就是1,3两个数排列 3)把3放在第1位,剩下的就是1,2两个数的排列 这种思想其实就是我们通常写出n个数的排列的一种思考过程,当然,对于n个数我们也可以考虑分成n种... 阅读全文
posted @ 2013-05-21 06:35 夜月神 阅读(797) 评论(2) 推荐(0) 编辑
摘要: 如果你认为自己应该是计算机科学家,那么,你应该做如下的事情:1,你学的第一门语言应该是C++,第二门是汇编2,你应该对数学的掌握不差于数学专业的比较差的学生,对于数论那些东西你也应该会3,你应该读过算法导论,更进一步的,你应该读过TAOCP(我觉得一个合格的程序员应该读过这本书)4,你应该深入理解一个系统,如果是windows 的话,你应该理解这个系统的设计理念,你应该深入理解这个系统的API,你应该深入这个平台编程,应该理解COM的原理以及为什么windows平台需要com5,你应该有一颗研究的心,一颗追求完美的心(虽然计算机的本质就不是完美的,如果要说什么是完美的,那只有数学,因为在这里面 阅读全文
posted @ 2012-12-26 12:43 夜月神 阅读(667) 评论(15) 推荐(0) 编辑
摘要: 2012-12-03阿里巴巴有如下的笔试题目:有一个神奇的数组,其中的第i个元素在排序之后的位置位于[i-k, i+k]之间(k序的).试写算法把一个k序数组排序,要求最快.解法,显然有以下几个子序列:X[0], X[k+1], X[2(k+1)], X[3(k+1)]......X[1],X[k+1+1],X[2(k+1)+1],X[3(k+1)+1]..............................X[k],X[k+1+k],X[2(k+1)+k],X[3(k+1)+k]......这k+1个子序列是已经排序好的,剩下的任务是把其归并有两种方法:方法一,普通的merge,与把两个 阅读全文
posted @ 2012-12-26 12:38 夜月神 阅读(1542) 评论(5) 推荐(0) 编辑
摘要: 一个由inline引起的讨论以下函数定义有问题么://function.hVoid hello(){ Printf(“hello,world”);}一般人看起来肯定觉得不对,因为我们基本上只把函数定义放在cpp里面,然后定义一个.h声明一下,在使用的地方include 一下这个.h就Ok了。可是为什么要这样做呢?换句话说,如果我们按上面的方法定义hello(在一个.h里面定义),然后在两个文件a.cpp和b.cpp里面同时include了它,然后我们编译的时候没错,链接的时候告诉我们hello被定义了两次,这是为什么呢?我们要知道,你include一个文件的时候相当于把那个文件的内容copy到 阅读全文
posted @ 2013-05-21 06:38 夜月神 阅读(441) 评论(0) 推荐(1) 编辑
摘要: 编程之美上面有个NIM的游戏,规则如下:有n堆石头,两个人轮流从中取,一次只能在一堆中取,至少取一个,最多把这一堆取完,取得最后一个石头的人胜利,问谁有必胜策略。解: 设这n堆石头的个数分别是X1,X2……Xn,设F(X)= X1 ^X2 ^ X3……^Xn。如果F(X)= 0则后取的获胜,否则,先取的获胜。证明: 如果这剩下的石头的个数的的异或值为0,则无论从一堆中取多少个,取完之后剩下的异或值一定不是0,反之,如果异或值不为0,那么一定可以从一堆中取一些,从而使取完之后的异或值为0.但是,有一个似乎更难的题目,就是有n堆石头,两个人轮流从中取,一次只能在一堆中取,至少取一个,最多把这一堆取 阅读全文
posted @ 2013-05-21 06:36 夜月神 阅读(246) 评论(0) 推荐(0) 编辑
摘要: 先放代码,算法设计过程我随后再放上去[cpp]view plaincopyprint?//author:1025679612@qq.com[cpp]view plaincopyprint?//csdn:<ahref="http://blog.csdn.net/wind_2008_06_29/article/details/7706531">http://blog.csdn.net/wind_2008_06_29/article/details/7706531</a>[cpp]view plaincopyprint?#include<iostre 阅读全文
posted @ 2012-12-26 12:45 夜月神 阅读(285) 评论(0) 推荐(0) 编辑
摘要: 著名的货郎担架问题大家都明白,现在要求解它。有两种办法方法一,暴力枚举法,举出所有的路径,这方法最简单,但是,需要N!的复杂度,当n比较大时,完全没有可计算性,当然,生成n!种排列比较简单,不需要什么高端的技巧。在此不解释这种解法方法二,动态规划,设T(Vi,V)表示从V1经过V中所有结点到Vi的最短路径值,于是我们有以下的转移方程 T(Vi,V)=min{D(k,i)+T(Vk,V\{Vk}}其中Vk是V中元素,其中D(k,i)表示第k个结点到第i个的距离(允许取无穷大)。我们要求解的问题是T(V1,V\{V1}).----即我们从V1出了,遍历V中除V1之外的结点,然后回到V1.根据这个. 阅读全文
posted @ 2012-12-26 12:40 夜月神 阅读(1275) 评论(0) 推荐(0) 编辑
摘要: 看到博客员这么热闹,我也来了 阅读全文
posted @ 2012-12-03 12:51 夜月神 阅读(103) 评论(0) 推荐(0) 编辑