随笔分类 -  算法和数据结构

《编程之美》:求二叉树中节点的最大距离
摘要:看到这题,第一时间就联想到了求二叉树深度(通过分别求左右子树的深度,然后合并(取最大值加1)从而得到了根节点的深度(其实就是分治思想))代码如下:[代码]而现在我们要求节点的最大距离,我们可以用同样的方法去思考:对一个节点A,其子树中节点的最大距离一定是A左子树的深度 + A右子树的深度,所以我们只要用“分治”的思想递归求解即可,并且用一个MaxLen来维护最大值:[代码]... 阅读全文

posted @ 2010-06-22 13:11 DiaoCow 阅读(369) 评论(0) 推荐(0)

《编程之美》:分层遍历二叉树
摘要:1.输出二叉树某一层结点(从左到右)把输出二叉树第K层结点转换成:分别输出"以该二叉树根结点的左右子树为根的两棵子树"中第K-1层结点。[代码]个人觉得,原书中:return a() + b()似乎不能保证从左往右输出,因为a() + b()的调用顺序是由编译器决定的,并不一定是从左往右。2.按层从上到下遍历二叉树,每一层单独一行且从左往右输出front为队首指针,指向队首元素,rear为队尾指针... 阅读全文

posted @ 2010-06-01 14:53 DiaoCow 阅读(2763) 评论(0) 推荐(0)

总结下最近做的些题目
摘要:动态规划1.Max Sequence ,Maximum sum这两题都是求最大m子段和(m = 2)最大m子段和(最大子段和在子段个数上的推广):设b[i][j]表示从前j项中i个子段和的最大值,且第i个子段和包含a[j];因此状态转移方程为:b[i][j] = Max(b[i][j-1] + a[j] , b[i-1][t] + a[j]); ( i-1 <= t < j)b[i]... 阅读全文

posted @ 2010-05-19 22:20 DiaoCow 阅读(388) 评论(0) 推荐(0)

图论中的基本问题(未完)
摘要:1.最小生成树a.kruskal 算法在遇到最小生成树问题时,我个人偏好用kruskal算法,实在是觉得其中并查集的运用太经典了。第一步:对所有的边从小到大排序;第二步:依次选取n-1条不会产生回路的边;(用并查集判断添加边<i,j>是否产生回路)模板:代码b.(朴素)prim算法从任意节点开始,依次添加最小边到集合中去,类似Dijkstra算法模板:代码相关题目(比较基础):Jung... 阅读全文

posted @ 2010-05-15 19:46 DiaoCow 阅读(375) 评论(0) 推荐(0)

线段树和树状数组题目总结(未完)
摘要:1.Minimum Inversion Number首先要知道如何求一个序列的逆序数,比如2514 :2之前没有数大于它,所以为0,5之前也没有数大于它,所以为0,1之前2,5都大于它,所以为2,4之前只有5大于它,所以为1, 因此2514的逆序数为:0 + 0 + 2 + 1 = 3;从前面的描述中,我们可以发现,只要依次累计前面有几个数大于当前数即可。于是我们可以用一个数组b[n](初始化为0... 阅读全文

posted @ 2010-05-08 14:42 DiaoCow 阅读(1024) 评论(0) 推荐(0)

初识,线段树和树状数组
摘要:这几天在网上看了很多关于线段树和树状数组的资料,感觉是很重要的数据结构,有必要边学边做下记录。1.线段树凡是关于线段树的资料,我想都有这么一张图,的确,它给了人最初的感性认识,其次这幅图在以后分析问题时也很有帮助:线段树的基本操作(由于线段树是一棵完全二叉树,且每条线段以类似“二分”的方法处理,因此时间复杂为O(logN)):[代码]  int l , r; //线段左右端... 阅读全文

posted @ 2010-05-07 10:41 DiaoCow 阅读(854) 评论(0) 推荐(0)

搜索总结
摘要:1.Sticks对于WA,TLE很多次的人说,这道题绝对经典!我也是看了这位仁兄的代码才AC = =! , http://www.cnblogs.com/lotus3x/archive/2008/07/25/1251552.html代码剪枝1:因为如果这些sticks能够分成M段,那么每个stick一定都能找到属于自己的段(我感觉这是最重要的剪枝,之前一直TLE就是因为这里,程序没有及时的返回,一... 阅读全文

posted @ 2010-04-24 14:14 DiaoCow 阅读(407) 评论(0) 推荐(0)

批处理作业调度程序(优化了一个细节)
摘要:王晓东书上的例子,但是我做了优化并没有使用f2[]数组,只是简单的用了一个f2和last变量。[代码]算法就是回溯+简单的剪枝(f < bestf) 阅读全文

posted @ 2010-04-23 16:15 DiaoCow 阅读(355) 评论(0) 推荐(0)

并查集总结
摘要:并查集的基本操作:合并两个不相交的集合,查找某个元素所在的集合。[代码]//查找(压缩路径)int Find(int x){ if(x != p[x]) { p[x] = Find(p[x]); } return p[x];}//合并(加权规则)void Union(int x , int y){ int a , b; a = Find(x); b = Find(y); if(a == b) re... 阅读全文

posted @ 2010-04-22 19:02 DiaoCow 阅读(594) 评论(0) 推荐(0)

字典树
摘要:今天看了字典树原理,顺便AC了几个简单的题目,做一下总结。(字典树)字典树的基本功能是用来查询某个单词(前缀)在所有单词中出现次数的一种数据结构,它的插入和查询复杂度都为O(len),Len为单词(前缀)长度,但是它的空间复杂度却非常高,如果字符集是26个字母,那每个节点的度就有26个,典型的以空间换时间结构。字典树基本模板:代码1.统计难题(这里都用数组分配结点,用malloc分配太慢了)这题就... 阅读全文

posted @ 2010-04-19 13:58 DiaoCow 阅读(10948) 评论(0) 推荐(4)

动态规划“数塔”类型题目总结
摘要:前几天做了好几个DP题目,感觉都是一个类型的,因此有必要总结一下。数塔问题 :要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?分析:站在位置9,我们可以选择沿12方向移动,也可以选择沿着15方向移动,现在我们假设“已经求的”沿12方向的最大值x和沿15方向的最大值y,那么站在9的最大值必然是:Max(x,y) + 9。因此不难得出,对于任意... 阅读全文

posted @ 2010-04-18 18:42 DiaoCow 阅读(5261) 评论(0) 推荐(0)

0/1背包问题
摘要:0/1背包问题是背包问题中最基本的一种,其状态转移方程:m[i][j] = Max(m[i+1][j] , m[i+1][j - w[i]] + v[i]) 对比了自己的代码和王晓东书上的代码,感觉在两方面值得自己学习:1. jMax = Min(w[i] - 1 , c); 这样写法使得在(0 ~ jMax)可以直接赋值,无需判断,因此减少了判断次数;2. 对于求m[1][c],并不是放在循环体... 阅读全文

posted @ 2010-04-17 17:13 DiaoCow 阅读(1352) 评论(4) 推荐(0)

重建二叉树
摘要:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1944这道题是练习递归并深刻理解二叉树遍历的好题目(编程之美上也有)[代码]//重建二叉树void Rebuild(char *pPreOrder , char *pInOrder , Node **pRoot , int nTreeLen){ int nLeftLen ,... 阅读全文

posted @ 2010-04-17 15:32 DiaoCow 阅读(2625) 评论(0) 推荐(0)

整数划分和放苹果问题
摘要:整数划分问题和正整数连续划分问题:http://www.cnblogs.com/nokiaguy/archive/2008/05/11/1192308.html讲的很细致放苹果问题:把m个苹果放到n个盘子里,允许有空,有多少种放法http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=2679递归方程... 阅读全文

posted @ 2010-04-16 20:52 DiaoCow 阅读(1705) 评论(0) 推荐(0)

最长递增子序列
摘要:http://acm.tzc.edu.cn/acmhome/problemdetail.do;jsessionid=558B14243DB112F263306E7D3741A8A9?&method=showdetail&id=1052在《编程之美》看过这题,中间利用二分查找可以把复杂度从O(N^2)降低到O(NlogN)[代码]int LIS(int * arr , int n){... 阅读全文

posted @ 2010-04-16 20:05 DiaoCow 阅读(312) 评论(0) 推荐(0)

最长公共子序列和字符串相似度
摘要:经典的DP问题。1.假设求X = {x1 , x2 , x3, ... , xm}和Y = {y1 , y2 , y3, ... ,yn}的最长公共子序列MaxLen(Xm , Yn),我们可以这样思考:若xm == yn ,那么最长公共序列为MaxLen(Xm-1 , Yn-1) + 1;若xm != yn ,那么最长公共序列为MaxLen(Xm-1 ,Yn)和MaxLen(Xm ,Yn-1)中... 阅读全文

posted @ 2010-04-16 20:01 DiaoCow 阅读(1352) 评论(0) 推荐(0)

最大矩阵连乘次数
摘要:这题只不过把王晓东书上求最小连乘次数改为了求最大连乘次数,方法还是DP状态转移方程:m[i][j] = Max(m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j]) [代码] 阅读全文

posted @ 2010-04-16 19:51 DiaoCow 阅读(465) 评论(0) 推荐(0)

导航