
数据结构和算法
文章平均质量分 51
wche1990
这个作者很懒,什么都没留下…
展开
-
调用函数库中快速排序算法(以整型类型为例)
#include#include#include//qsort()函数位于stdio.h中//调用函数库提供的快排算法时,要根据排序的数据类型重写这个接口函数//下面是整形类型的接口函数int cmp(const void* a, const void* b){ return *(int*)a - *(int*)b;}int main(){原创 2011-10-21 20:30:51 · 720 阅读 · 0 评论 -
(博客搬迁)hdu1069 Monkey and Banana(最长不下降子序列)
思想:如序列{4,6,5,7,3},则其最长不下降子序列为{4,6,7};算法实现:时间复杂度(n^2) int Lc(int num[], int n) { int i,j, max = 0; int list[n]; for(i = 0; i { list[i] = 1;原创 2011-11-07 19:21:14 · 1174 阅读 · 0 评论 -
(博客搬迁)二维多重背包转化为01背包
题意:有n种物品,每件物品的价值为pr[i],体积为v[i],重量为w[i],数量为c[i]。现有一个体积为V,最大可承受重量为W的背包。问:怎么样选择物品,使得背包中的物品价值最大?分析:这题其实与上一题差不多,思路是一样的,只是多了一维,相应的记录数组也多一维就搞定。仍然是以二进制的思想来进行优化。不过因为数组变成了二维,所以数组不能开得太大。其实,不管多重背包变成多少维,解题的思路是一样原创 2011-11-07 19:22:19 · 1226 阅读 · 0 评论 -
(博客搬迁啦)pku1276多重背包问题(http://poj.org/problem?id=1276)
刚看到这题的时候,想都没多想,就开始暴力,结果runtime error,我想那应该是数组越界了。因为我暴力的解法的空间复杂度是nk[1]*nk[2]*、、、不用多想也知道是越界了,可是我好久后才发现,真水~这是个多重背包问题,第二次我把它转化为01背包问题,结果TLE. 因为我把它转化为N*nk[i]张钞票,cash的最大值为100000,这种做法显然会超时。不过我的体会也挺深的,就是01背原创 2011-11-07 19:23:31 · 1572 阅读 · 0 评论 -
(博客搬迁啦~)Max Sum Plus Plus(http://acm.hdu.edu.cn/showproblem.php?pid=1024)
我觉得这是一道很好的dp题。题意:n个元素分成不相交的m段,求这m段和的最大和分析:cur(i,j) = max(cur(i,j-1)+a[j], max(cur(i-1,t))+a[j]) (1 cur(i,j)表示前j个元素中 i 段和的最大和 , 他等于前 j-1 个元素中 i 端和的最大和 与 前i-1段中的最大和 这两者中的最大值加上第j 个元素, 前者即为cur(i,原创 2011-11-07 19:25:00 · 1820 阅读 · 0 评论 -
(博客搬迁啦)寻找多元素算法hdu1029(2010年10月17日)
寻找多元素算法hdu1029多元素即在数列中出现次数多于n/2的元素我们很容易的看出来,在一个序列中如果去掉2个不同的元素,那么原序列中的多元素,在新的序列中还是多元素, 因此我们只要按照序列依次扫描,先把A[0]赋值给c,增加个计数器,count = 1;然后向右扫描,如果跟c相同,则count++,不同,那么count --,这个真是我们从上面那个结论里得出的,一旦count原创 2011-11-07 19:26:14 · 1494 阅读 · 0 评论 -
博弈论的一些基础知识(参考网络资料,学习总结,很好,分享并保存)
(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜.显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜.因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(原创 2011-11-07 19:10:28 · 1398 阅读 · 0 评论 -
hdu1527(博弈问题)
分析:威佐夫博弈(Wythoff Game)问题(摘自网络)前几个必败点如下:(0,0),(1,2),(3,5),(4,7),(6,10),(8,13)……可以发现,对于第k个必败点(m(k),n(k))来说,m(k)是前面没有出现过的最小自然数,n(k)=m(k)+k。一个必败点有如下性质:1.所有自然数都会且仅会出现在一个必败点中;证明:m(k)是前面没有出现过的最小自然数,自然与原创 2011-11-07 19:12:15 · 969 阅读 · 0 评论 -
hdu1421搬寝室DP(ACM题目,动态规划)
分析:dp[i][j]表示前i个元素中 j 对数的最小差平方和 dp[i][j] = min(dp[i-1][j], dp[i-2][j-1] + (weight[i] - weight[i-1])*(weight[i] - weight[i-1]));code:#include#include#define min(a,b) ((a) > (b) ? (b) : (原创 2011-11-07 19:14:01 · 1356 阅读 · 0 评论 -
pku1882 Stamps(http://poj.org/problem?id=1882)(博客搬迁)
分析1 :百度和goole了,都说是完全背包,可是我怎么想都不像,只是循环的形式相似,其本质我认为不是完全背包问题。我以为这更像是枚举。code:#include#includeint main(){ int s, t; int n; int i, j, k; int a[11], sum[10003]; int max, b[11]; while(sc原创 2011-11-07 19:17:51 · 1440 阅读 · 0 评论 -
pku1276 Cash Machine(http://poj.org/problem?id=1276)
分析:这是一个多重背包问题,记得上次做过,好像是hdu上的,可是没写报告,所以这次在pku上看到了就重做了一次。多重背包的思想不是很清楚了,重做一次也算是温习吧。这题采用二进制进行优化,其中的思想就不多说了。code:#include#includeint max(int a, int b){ return a > b ? a : b;}int main(){原创 2011-11-07 19:15:37 · 539 阅读 · 0 评论 -
模式串匹配之KMP算法代码及注释
#include#includechar str[100];int next[100];void Get_next(char *str, int* next){ int len = strlen(str);//模式串的长度 int i = 0; int j = 1; next[0] = 0; //下标从0开始 while(j { if(str原创 2011-11-07 18:39:23 · 1000 阅读 · 0 评论 -
求L^n mod m,设计O(log n)的算法
//求L^n mod m,设计O(log n)的算法#include#include//返回x的平方int square(int x){ return x*x;}//用递归思想求L的n次方,充分利用计算后的结果,减少重复计算int exp(int L, int n){ if(0 == n)return 1; if(0 == n%2)原创 2011-10-21 21:17:11 · 1614 阅读 · 0 评论 -
调用函数库中的快速排序算法qsort()排序各种数据类型
快速排序算法已经有函数库提供给我们了,我们只要根据待排序的数据类型,重写cmp()这个接口函数就行了。下面是实例。qsort()函数在stdlib.h库中C语言中的qsort()函数原型为void __cdecl qsort ( void *base, size_t num, size_t width, int (__cdecl *comp)(const void *, const v原创 2011-10-21 21:56:53 · 1226 阅读 · 0 评论 -
求正整数n的分解式——通过题目来了解和加深递归思想
刚开始,我们学习递归思想的时候可能都会以求N的阶乘为例子。这是一个很简单的递归例子,可以很直白地展现递归的思想。可是我们对递归的理解往往会限于这种简单的模式中,很难跳出来。当我们遇到稍微难点的问题,我们可能又无从下手了。我深有感触。下面是一个比较好的例子,做出后,对递归的了解会更加深刻。题目:对于给定的正整数n,编程计算n共有多少种不同的分解式。Example:12=2*2*3=2*3原创 2011-10-21 20:12:19 · 3725 阅读 · 0 评论 -
将10进制整数i 转换为d 进制数表示
这是一个简单的算法设计题目,是《算法设计与分析》课程的练习题。代码:#include#include#define Maxlen 100//将十进制i转换为d(dvoid exchange(int d, int i){ char table[37]="0123456789abcdefghijklmnopqrstuvwxyz";//用于表示进制的符号表原创 2011-10-21 20:23:56 · 1215 阅读 · 0 评论 -
控制CPU使用率——编程之美例题
刚看了《编程之美》的第一章,里面有个例子是讲怎么样控制CPU使用率的。这使得我想起了我以前做过的一个屏幕录制程序。屏幕录制程序的做法就是每隔一段时间就把屏幕上图像保存一次。这是最直观的方法,当然也是最不好的方法,因为这会造成CPU被强行地占用(你会发现运行这样的程序时,你的机器会立马慢下来,那是因为程序一直在那里循环着“监控”CPU时间,一到时间就执行保存屏幕图像的操作。这样,CPU的使用率机原创 2011-10-28 16:52:41 · 1323 阅读 · 0 评论 -
设计Huffman编码(算法设计与分析课程实验)
直接贴Code:#include #include #include //节点数据结构typedef struct{unsigned int weight;unsigned int parent, lchild, rchild;}HTNode, *HuffmanTree;typedef char **HuffmanCode;void select原创 2011-11-22 18:06:42 · 2014 阅读 · 0 评论 -
求大数高次幂的模
题目:/*球大数高次幂的模X^Y mod Z思路:x^y mod z = (x % z)*(x % z)*、、、*(x % z)*/#include bool Getmi(int X, int Y, int Z, int &res){ int numl(1); int numy(Y); int multi(X); int tmp(0); int原创 2011-11-22 18:14:31 · 2288 阅读 · 1 评论 -
不要被N!吓到--《编程之美》例题
/*不要被阶乘吓到!来着《编程之美》例题。问题:1、给定一个整数N,求N!的末尾0的个数。2、求N!的二进制表示中最低位1的位置。*/#include #include /*在做之前,应该理解一个规律:[N/k]等于1,2,3、、、,N中能被k整除的数的个数。在下面计算5的质因子个数时会有讲解。*///第一个问题://求末尾0的个数,其实原创 2011-11-07 10:41:30 · 979 阅读 · 0 评论 -
(博客搬迁)pku2231 Moo Volume(数学题http://poj.org/problem?id=2231)
分析:求所有牛的通信路程的总和。查看数据,如果用二重循环会超时,而且数据比较大,所以要用__int64型。因为这是一维的,所以可以先排序,然后可以推出一个数学关系式。每增加一头牛,路程总和会增加(pos[i] - pos[i-1])*2 + (pos[i] - pos[i-2])*2 + ...+(pos[i] - pos[1])*2 = {(pos[i] * (i-1) - (pos[1] +原创 2011-11-07 19:20:00 · 1413 阅读 · 0 评论