2012年8月1日

摘要: 洗牌的算法有很多,这里主要介绍下几种主要的算法。 方法一:每次找一个随机的位置,然后将这54个数放到找的位置中。 步骤:1.用一个整型数组记录各个位置是否已经放置了数,如果放置了则不为0,否则为0。所以在算法开始的时候,初始化此数组每个元素的值都为0. 2.每次产生一个0-53之间的数,看这个位置是否放置了数,如果已经放置了,则继续采用同样的方法找一个随机的位置进行判断,如果这个位置还未放置,则设置此位置。 3.反复执行步骤2,直到所有的位置都放好了数。 代码实现如下: 1 void shuffle(int *dest,int N) 2 { 3 int pos,card; 4 ... 阅读全文
posted @ 2012-08-01 20:39 Trony 阅读(8103) 评论(0) 推荐(0) 编辑
 
摘要: Q:例如:有一个序列,例如 9 8 2 1 7 5 3 4 3 2 1. 求出最长的递减子序列。如本例的结果就是:9 8 7 5 4 3 2 1。分析: 可采用动态规划的思想进行解答,时间复杂度为O(n^2). 设原数组为a[1....n]。另设一数组d[1....n],其中d[i]表示从第i个元素开始(一定包含第i个元素),到整个数组末尾的子序列 a[i...n]中的最长递减子序列的长度。 则本问题就是要在求出d[1]的同时,恢复出最优解。 下面给出递推式:d[i]的值分两种情况:1、当i=n时,d[i]=1。即最后一个元素的序列的最大递减子序列中只有它自己。2、当i<n时,d[i]= 阅读全文
posted @ 2012-08-01 16:29 Trony 阅读(4272) 评论(0) 推荐(1) 编辑
 
摘要: 分析此问题,可以利用动态规划的思想来进行解决。对于第i个元素(0<i<N)个元素而言,以其结尾的递增子序列长度由前i-1个数组成的所有递增子序列长度来决定,于是该问题就分为了i-1个子问题。 maxLenIncr[i] = max{ maxLenIncr[k]+1, maxLenIncr[i]} if (a[i]>a[k] && k>=0&&k<i && i>0)而当i=0时,maxLenIncr[0] =1. (maxLenIncr[i]表示以i结尾的最长递增子序列长度。)实现的代码如下: 1 #includ 阅读全文
posted @ 2012-08-01 15:15 Trony 阅读(240) 评论(0) 推荐(0) 编辑