学习算法
文章平均质量分 72
hpghy123456
这个作者很懒,什么都没留下…
展开
-
SegmentTree
SegmentTree:适用于区间插入,区间查找最值。 #include #include #include using namespace std;struct node{ int left, right; int pos; int mweight; int r; node *lchild, *rchild; node() { lchi原创 2011-11-04 20:59:30 · 1164 阅读 · 0 评论 -
Splay-tree poj 3580
SplayTree 伸展树:自调节的二叉搜索树,能把最近访问的节点移到根节点出。适用于各种实际应用,尤其适合实现cache和garbage collection算法。空间少,性能平摊也有竞争力,编程易实现。优点:1、 实现简单,比AVL、红黑树更简单。2、 性能好,平均性能比得上其他平衡二叉搜索树。可能会比AVL慢点。常数因子的差距。3、 没有其他的记录数据。4、 可以原创 2012-07-25 20:55:12 · 1797 阅读 · 1 评论 -
poj 1159
这题用short水过,一看网上大牛的代码,居然说可以用滚动数组!太厉害了。//poj_1159#include #include #define N 5010#define INF 10000#define hpmin(a,b) (a)<(b)?(a):(b)int n;char str[N];short int dp[N][N];int main(){ int i, l原创 2012-11-26 21:03:01 · 552 阅读 · 0 评论 -
uva 10617
这题想了一下,可以枚举出str[i]、str[j]的所有决策:1、如果str[i] == str[j],不删除str[i] str[j]:dp[i][j] += dp[i+1][j-1] + 1(1表示把[i+1,j-1]全删除后,它还是回文);2、删除str[i]:就是dp[i+1][j];3、删除str[j]:就是dp[i][j-1];4、同时删除str[i]、str[j]:就原创 2012-11-28 22:25:40 · 785 阅读 · 0 评论 -
zoj 1025
这题刚开始直接dp求最长非递减子序列,再加上next数组,于是WA。结合网上的代码,才发现,其实就是求最少组的非递减子序列,直接从小到大扫描就可以了。自己还是太水了,后悔大学不努力呀!/* * zoj_1025,就是求最少组的非递减子序列,用贪心就可以,不用dp求最长非递减子序列 */#include #include #include #include using namesp原创 2012-12-01 21:57:02 · 1499 阅读 · 0 评论 -
poj 1141
这个题目让我蛋疼了一晚上,最后对比别人的代码,才发现问题:居然使用while ( scanf("%s", str) != EOF ) 导致WA!这不科学呀!//poj_1141#include using namespace std;#define INF 10000char str[110], result[210];int dp[110][110], pos[110][1原创 2012-11-22 20:31:27 · 779 阅读 · 0 评论 -
zoj 1100
这题是简单的状态压缩,和黑书的那个bug公司类似,不过更简单。代码如下:(当然,可以打表)#include #include #include using namespace std;#define HW 20#define hpmax(a,b) (a)>(b)?(a):(b)long long dp[2][2048]; //2^11int factor[13] = { 1,原创 2012-12-06 21:41:12 · 1545 阅读 · 1 评论 -
zoj 2710 Two Pipelines
这题我是用dp过的,回头看了网上的资料,可以用谈心。再想想吧,先保存以下代码:/* * zoj_2710.cpp */#include #include #include #include #include using namespace std;#define N 210#define INF 1e12/* * dp[i][x][y]: The state i原创 2012-12-09 16:04:22 · 1002 阅读 · 0 评论 -
poj 3494 Largest Submatrix of All 1’s
最近在学习单调桟,这个题目听有意思的,需要稍微动动心思,往poj 2559上想。但是时间总是1700MS左右,真不知道网上那些100ms是怎么出来的。/** * poj_3494.cpp * */#include #include #include using namespace std;#define MN 2010#define hpmax(a,b) ((a)>(b原创 2012-12-24 22:31:39 · 1709 阅读 · 1 评论 -
pat 1038 Recover the Smallest Number
这题明显是贪心的策略,但是排序算法一直没写好,费了我几个小时。后来发现,有个博客http://ppcool.iteye.com/blog/1731427 里面的排序好简单呀,好受打击。回宿舍继续舔伤口。/* * pat_1038.cpp */#include #include #include #include using namespace std;#define N 100原创 2012-12-16 11:51:05 · 2046 阅读 · 1 评论 -
zoj 2626 Polygon Game
这题Dp方程很容易想到,但是居然WA了一天,后来一个博客,才发现负数对最大值的影响。恍然大悟呀……/* * zoj_2626.cpp */#include #include #include #include using namespace std;#define N 52#define hpmax(a,b) (a)>(b)?(a):(b)#define hpmin(原创 2012-12-15 16:28:17 · 1008 阅读 · 0 评论 -
zoj 1986
我out了,想不到最长上升子序列还有nlogn的算法,看来以前学得不够仔细,于是把代码贴出来学习一下。 参考:http://blog.csdn.net/Hashmat/article/details/5883605http://acm.tzc.edu.cn/acmhome/topicListAction.do?method=topicDetail&id=52a13560222原创 2013-02-04 15:16:00 · 1000 阅读 · 0 评论 -
zoj 2401
这题我居然用背包过了。当然,算法不是最好的,根据网上的题解,如下算法更好。考虑str_c,它的最后一个字符c[la+lb-1]是a[la-1]或者是b[lb-1],于是递归下去有方程:dp[i][j] = dp[i-1][j]( 满足:a[i]==c[i+j]) | dp[i][j-1]( 满足:b[j]==c[i+j])。http://hi.baidu.com/delta_4d/it原创 2013-02-06 13:58:56 · 1028 阅读 · 0 评论 -
B+树
为什么说B+-tree比B 树更适合实际应用中操作系统的文件索引和数据库索引?1) B+-tree的磁盘读写代价更低 B+-tree的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。 举个例子,假设磁盘中的一个原创 2012-06-24 13:22:01 · 5994 阅读 · 0 评论 -
B+tree 实现
/** BPlusTree.h 2012/6/24--2012/7/5 hpghy, 790042744@qq.com **/#ifndef BPLUSTREE_H_#define BPLUSTREE_H_#include #include #include using std::queue;using std::cout;using std::endl;us原创 2012-07-05 16:13:49 · 1519 阅读 · 0 评论 -
zoj 2107
这题做了很久,一直都是1秒多,真不知道他们300ms是怎么做出来的。看了网上的代码,大部分都是O(nlgnlgn),于是绞尽脑汁,写了个O(nlgn)的代码,但是时间上没有显著地提高。/** * O(nlogn) * zoj_2107 **/#include #include #include #include #include using namespace std;原创 2012-05-21 15:19:00 · 959 阅读 · 0 评论 -
Sicily 做题
1934 移动小球:用静态链表记录每个球相邻的球编号。原创 2011-11-05 19:37:10 · 443 阅读 · 0 评论 -
sicily 1136 山海经
#include #include using namespace std;const int N = 100000;#define lchild(p) (((p)#define rchild(p) (((p)+1)struct node {int left, right;int ms, start, end;int lms, lend;in原创 2011-11-30 13:24:49 · 1249 阅读 · 0 评论 -
AVL树
#ifndef AVLTREE_H#define AVLTREE_H#include #include using namespace std;templatestruct AVLNode{ typedef AVLNode self; typedef AVLNode *pselft; T value; pselft child[2]; int height;原创 2011-12-26 21:32:37 · 445 阅读 · 0 评论 -
二项堆
/** * hp: min heap * 790042744@qq.com * 2012/2/11 */#ifndef BINOMIALHEAP_H#define BINOMIALHEAP_H#include #include using std::stack;using std::cout;using std::endl;templateclass Bi原创 2012-02-15 20:34:34 · 483 阅读 · 0 评论 -
Treap
/** * Treap.h * * 790042744@qq.com * 2012/2/16 * **/#ifndef TREAP_H#define TREAP_H#include #include #include using std::cout;using std::endl;templateclass Treap;template cl原创 2012-02-18 21:02:13 · 474 阅读 · 0 评论 -
红黑树
/*****************************************************************************************\ * rb_tree.cpp * 学习 SGI STL 中的实现 《STL源码剖析》 * 没有添加迭代器 *\*************************************************原创 2012-02-19 20:59:39 · 1730 阅读 · 0 评论 -
B-树 实现3
上次有了B-树的两种不同的实现,现在我们来测试一下两种实现的效率,由于命名一样,我设置了不同的名字空间,下面是测试代码:#include #include #include #include #include "BTree.h"#include "BTree2.h"using namespace std;const int maxcnt = 1000000;int r[max原创 2012-03-08 21:19:21 · 741 阅读 · 0 评论 -
B-树实现2
/** * BTree.h * * 采用网上流传已久的插入删除算法——回溯方式 * 与《算法导论》中的不一样,但是效率更高 * * 790042744@qq.com * 2012/3/5 * **/#ifndef BTREE_H#define BTREE_H#include #include using std::vector;using std::原创 2012-03-08 20:09:20 · 593 阅读 · 0 评论 -
B-树 实现
B-树主要用在文件系统中,关键字为文件名,值为文件在磁盘中的地址。分支因子很大,一般为50到2000,一个节点就用一个磁盘块存储。按照《算法导论》的描述,节点有如下性质:1、至少有t-1个关键字,至多2*t-1个关键字,关键字以升序排列;2、至少有t个子女节点指针,至多2*t个;3、n[x]个关键字对应n[x]+1个子女节点指针;4、根节点至少包含一个关键字;以下是原创 2012-02-29 20:47:07 · 657 阅读 · 0 评论 -
zju 2334 monkey king
因为最近在学习二项堆,所以拿这题练练手。其实这题思路很清晰,就是在二项堆中加入并查集的特性。因为在一个sb的地方犯了一个sb的错误,卡了几个小时。一切尽在代码中……/* * zoj2334 monkey king */#include #include #include using namespace std;#define CNT 100010const int INTMA原创 2012-04-09 22:54:55 · 920 阅读 · 0 评论 -
zoj 3234
#include #include #include #include using namespace std;struct Point { int x, y;};const int N = 2010;Point soldier[N];int n, cnt;int pt[N];bool flag[N];int pcnt;bool bRemain[N];int原创 2012-04-30 16:03:16 · 633 阅读 · 0 评论 -
zoj 1453
/** * zoj 1453 * 不需四舍五入 * */#include #include #include #include #include using namespace std;struct Point { int x, y;};const double eps = 1e-5;Point tree[110];Point stack[110];bool b原创 2012-04-30 16:05:54 · 627 阅读 · 0 评论 -
zoj 2156
/** * zoj_2156 * 多重背包+遍历路径,优先取小的 */#include #include #include using namespace std;int const value[] = { 1, 5, 10, 25 };int v[60], n;int coin[4], node[4], p;/* * 应该可以直接用一维代替,要再想想 * 错了,原创 2013-02-06 14:02:25 · 976 阅读 · 0 评论