字典树
字典树,数据结构相关的算法之一。刚开始还是比较难搞的,前前后后差不多有三个星期都在学这个,前两个星期都在看链表,学长说链表是数据结构的基础,不会链表后面的什么也学不会。刚开始看的时候,由于指针是个门槛,问了好多学长又问了老师,才算弄明白,也能看懂一些了。然后就是字典树的学习,从功能上讲字典树与map有一定的相似性,但是对于很多要处理的数据的话,map就不行了,只能用到字典树。
字典树的题算是个模板题吧!主要用到三个函数,就可以实现。
第一个函数是用来新建节点的。
记得在主函数外定义根节点,在主函数内给根节点申请内存。
第二个函数是用来插入字符串的。
这个题可以深入一点的理解字符串的插入和指针域大小的确定。
第三个函数式用来查找的,依据题意来确定查找的功能。
树状数组
树状数组,数据结构相关算法之一。具体是个什么东西以全然忘记,只知道和线段树很像,还记得NYOJ的士兵杀敌(1、2、4、5),貌似3是线段树。
树状数组的时间复杂度为log(n),有插点问线,插线问点的基本操作,并且用树状数组解决的问题,基本上都能用线段树解决,而线段树能解决的树状数组不一定能解决。相比较而言,树状数组效率要高很多。
树状数组涉及到位运算: return t & -t; 假设数状数组C中某个节点的编号为x,那么这个节点管辖的区间内的元素个数就为2^k(其中的k为x的二进制的末尾0的个数),又因为这个区间的最后一个元素必然为Ax,所以:Cn=A(n- 2^k + 1)+···An,而计算这个2^k就用到了: return t & -t; 位运算是个很高端很上档次的东西,希望能够细细研究。
另外,输入数组A时,应从A[1]开始,因为reutn 0 & -0;的值为0,这样会导致在循环时形成死循环!
区间DP
http://poj.org/problem?id=1738
如果你认为这个题还是和区间DP一样用DP[50000][50000]来做的话就错了,因为数组开不了那么大!所以,GarsiaWachs算法!
http://poj.org/problem?id=2955 (AC)
http://poj.org/problem?id=1141
http://poj.org/problem?id=3280
http://poj.org/problem?id=1651
http://poj.org/problem?id=1179
http://acm.hdu.edu.cn/showproblem.php?pid=2476 (AC)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3537
状态压缩
http://poj.org/problem?id=3254
http://poj.org/problem?id=1185
http://poj.org/problem?id=3311
http://acm.hdu.edu.cn/showproblem.php?pid=3001
http://poj.org/problem?id=2411
http://poj.org/problem?id=2288
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3471
http://acm.hdu.edu.cn/showproblem.php?pid=3681
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3777
http://acm.hdu.edu.cn/showproblem.php?pid=3682