算法
oaeo
年过三十的老男人了
展开
-
HDU 1160
类似最长连续(不紧靠)子串,方法有两种参考http://blog.csdn.net/chaoojie/article/details/7919062先按照体重从小到大排序,再按照速度求最长子串#include "stdio.h"typedef struct _Fat{ int w, s; int p;}Fat, *pFat;Fat mice[1001]原创 2013-05-03 16:52:15 · 604 阅读 · 0 评论 -
hdu 2190
DPdp[i][j]表示,第i列,以方式j结束时的情况数。#include "stdio.h"#include "string.h"void main(){ int c, n, i; int dp[31][2]; //方式0,以1*1的地砖结束;方式1,以2*2的地板结束 memset(dp, 0, sizeof(dp)); dp[1][0] = 1; dp[2][0原创 2012-07-27 15:51:13 · 805 阅读 · 0 评论 -
hdu 2189
直接DFS会超时,所以改用DP#include "stdio.h"#include "math.h"#include "string.h"int prime[50], p;void main(){ int c, n, i, j, k, t; int dp[151][50]; //因为个体无差别,所以要保证分组是以个数递增来的 memset(dp, 0, sizeof(dp)原创 2012-07-27 15:18:18 · 769 阅读 · 0 评论 -
AVL 平衡二叉树
#include "stdio.h"#include "stdlib.h"typedef struct _Node{ int data; int h; struct _Node* lf; struct _Node* rt;}Node, *pNode;int ht(pNode a){ return a?a->h:0;}int mh(pNode a, pNode b){原创 2012-07-16 16:32:34 · 420 阅读 · 0 评论 -
Splay 伸展树
应该算比较精简了,不过 指针 和 指向指针的指针 实在头疼!#include "stdio.h"#include "stdlib.h"typedef struct _Node{ int val; int rev; int child; struct _Node* pre; struct _Node* ch[2]; //0,左孩子; 1,右孩子;}Node, *pNode;原创 2012-07-19 16:15:10 · 329 阅读 · 0 评论 -
hdu 3487
做了一天……内牛满面……参考资料:http://dongxicheng.org/structure/splay-tree/http://blog.csdn.net/liuwei_nefu/article/details/5901869#include "stdio.h"#include "stdlib.h"typedef struct _Node{ int原创 2012-07-26 19:50:58 · 799 阅读 · 0 评论 -
hdu 2069 DP
先看一下 11 如何分解:1 1 1 ... 1 1 11 1 1 1 1 1 51 5 51 10共 4 种方法,所有的方法可以列成这样一行一行的数列,并且从左到右硬币值依次增大。本题可以使用动态规划。先考虑一下,不限制硬币的总数,即可以超过100枚,应该怎么写?int coin[6] = {0, 1, 5, 10, 25, 50};int dp[251][原创 2012-07-05 16:29:39 · 828 阅读 · 0 评论 -
hdu 2586 Tarjan离线
参考上一篇文章。这题建图有点不知道怎么下手,稀里糊涂也过了。现在想想Tarjan离线就是DFS+并查集,不难#include "stdio.h"#include "string.h"#include "stdlib.h"#define M 40001#define Q 200int n, q;typedef struct _Node{ int dis; int v;原创 2012-08-09 10:34:40 · 533 阅读 · 0 评论 -
ST 稀疏表
RMQ问题#define MAX(a, b) ((a)>(b)?(a):(b))int num[100] = {3, 9, 10, 4, 0, 7, 1, 8, 12, 5};int n = 10;int f[M][M];void ST(){ int i, j; int k = (int)(log(n)/log(2)); /// for(i=0; i<n; i++){原创 2012-08-09 14:27:12 · 1749 阅读 · 0 评论 -
hdu 3415
单调队列参考资料:http://wenku.baidu.com/view/432e4c2ce2bd960590c677c6.html第一次写,粗心地把最后输出语句的%n写成了%k,搞了好久#include "stdio.h"#define M 100010typedef struct _Node{ int val; int pos;}Node, *pNode;Node原创 2012-07-24 16:10:07 · 533 阅读 · 0 评论 -
LCA Tarjin 并查集 离线
以前了解的Tarjin算法是用来求连通分量,在这里是用来求最近公共祖先并查集用过,很有意思的工具。Kraskal算法是并查集最经典的应用。首先初始化集合,每个元素为单个集合。集合,我们需要选出一个代表,这个代表的性质是set[u] = u。一开始一个集合只有一个元素,所以该集合的代表也就是该元素。当两个集合需要合并时,例如:set[a] = a, set[b] = b。要是把a当作合并后集原创 2012-08-08 19:58:18 · 1401 阅读 · 0 评论 -
堆 排序
#include "stdio.h"int num[100] = {100, 3, 2, 0, 8, 9, 32, 12, 4, 1};int n = 10;void swap(int* a, int* b){ int t = *a; *a = *b; *b = t;}void ajast(int p, int ed){ if(2*p+1>=ed) return; if(原创 2012-08-06 11:31:23 · 337 阅读 · 0 评论 -
Treap 堆树
与AVL树操作类似,代码更简单#include "stdio.h"#include "stdlib.h"#include "time.h"typedef struct _Node{ int data; int fix; struct _Node* lf; struct _Node* rt;}Node, *pNode;void l_rot(pNode* root){ pN原创 2012-07-19 11:47:26 · 382 阅读 · 0 评论 -
hdu 3006 状态压缩
动态规划之状态压缩,实际就是灵活运用位运算。一个数,转换成2进制,其每一个位的0或者1,都好比是一个开关。这样可以通过灵活的位操作来简化复杂的状态转换。例如:数字 7,二进制为 111。111 的状态,可以通过 110 | 001 , 101 | 010 , 011 | 100 这三种情况如何获得一个数的二进制最后一个1的位置?公式: x & (-x)。例如, (10) &原创 2012-07-03 15:03:15 · 1095 阅读 · 0 评论 -
hdu 2102
做搜索题目最重要的是要细心!这道题注意:当对应位置都为#时,会在两个空间内不停地传送,所以这个#不应该进入/*hdu 2102*/#include "stdio.h"typedef struct _Map{ char c; int tm;}Map, *pMap;typedef struct _Node{ Map (*sp)[10]; //空间 int x,原创 2012-07-02 11:33:46 · 825 阅读 · 0 评论 -
hdu 2152 母函数
母函数。注意水果最小值最大值的选取。#include "stdio.h"#include "string.h"void main(){ int n, m; int fl[101], fh[101]; int ccc[101], t[101]; int i, j, k; freopen("in.txt", "r", stdin); while(scanf("%d %d"原创 2012-07-11 16:52:15 · 510 阅读 · 0 评论 -
hdu 2571 BFS
BFS搜索#include "stdio.h"#include "string.h"#define MAX(a, b) ((a)>(b)?(a):(b))#define MIN(a, b) ((a)<(b)?(a):(b))int n, m;int map[21][1001];int max[21][1001];typedef struct _Node{ int原创 2012-07-11 14:58:42 · 382 阅读 · 0 评论 -
hdu 2795 线段树
要注意:h和n的关系,创建树的时候,实际最多200000行#include "stdio.h"#include "stdlib.h"#define MAX(a, b) ((a)>(b)?(a):(b))typedef struct _Node{ int max; int st, ed; struct _Node* lf; struct _Node* rt;}Node, *p原创 2012-08-13 17:49:19 · 353 阅读 · 0 评论 -
hdu 1540 线段树
还是要有想象力……这题需要一个栈,用来保存摧毁的顺序。可能出现一个地点,被摧毁多次,而重建时,出栈,只有第一次需要重建,后面再出栈,发现已经是建好的,就不需要再重建例如:摧毁顺序是 5 2 4 5,重建时,5先出栈,重建。然后4、2依次出栈。5再出栈时,发现已经建好,那么就不用再重建了。问题的关键在如何搜索与某个点直接和间接相连的点,我的思路是:首先递归找到这个点,假设是k,然后回退。原创 2012-08-14 11:46:11 · 616 阅读 · 0 评论 -
RMQ问题 树状数组
用树状数组解决RMQ问题,请看参考资料,作者用Java实现参考资料:http://www.cnblogs.com/ljsspace/archive/2011/08/10/2133514.html下面是仿照用C实现:#include "stdio.h"#include "string.h"#define M 100#define LOW(p) ((p)&(-(p)))int原创 2012-08-15 17:32:00 · 671 阅读 · 0 评论 -
HDU 1158 动态规划
#include "stdio.h"#include "string.h"#include "math.h"#define MAX(a, b) ((a)>(b)?(a):(b))#define MIN(a, b) ((a)<(b)?(a):(b))int n;int h, c, f;int w[13]; //12个月int main(){ int i, j, z, m,原创 2013-05-03 15:30:07 · 543 阅读 · 0 评论 -
HDU 1164
简单的题目,适合新手学习下面的程序,融合了:1、快速求质数;2、二分查找;3、递归;快速求质数,参考:http://blog.csdn.net/chaoojie/article/details/7710988#include "stdio.h"#include "math.h"int pri[7000];int n;int k;int check(int v){原创 2013-05-04 17:07:18 · 986 阅读 · 0 评论 -
HDU 1143
递推,参考资料:http://blog.csdn.net/ma_nong/article/details/7339411http://www.cnblogs.com/chaosheng/archive/2012/06/02/2532030.html当dp[i] 划分成 2 和 i-2 后,再划分成 4和i-4时,4的部分,不能再划分成2 , 2 组合,这样就会和前面的2原创 2013-04-27 21:36:19 · 1771 阅读 · 0 评论 -
HDU 1116
参考资料:http://www.2cto.com/kf/201107/96614.html当且仅当图是一条欧拉回路或者欧拉通路的时候,才能满足题目的要求,至于欧拉回路和欧拉通路的判定可以总结为如下:1)所有的点联通2)欧拉回路中所有点的入度和出度一样。3)欧拉通路中起点的入度 - 出度 = 1,终点的 初度 - 入度 = 1, 其他的所有点入度 = 出度;#in原创 2013-04-26 14:47:09 · 625 阅读 · 0 评论 -
HDU 3401 DP+单调队列
不会做,看别人的代码,想了一天才想明白原文地址:http://blog.csdn.net/fp_hzq/article/details/7881075#include "stdio.h" #define M 2001 #define MAX(a, b) ((a)>(b)?(a):(b)) int dp[M][M]; int t, m, w; int ap, bp,原创 2012-12-05 15:53:46 · 456 阅读 · 0 评论 -
hdu 2483
写模拟类型的题是细致活……#include "stdio.h" #include "string.h" int m[301][301]; int r, c; int row[301][301], col[301][301]; int main(){ int z, i, j, k, c1, c0, t, sum; freopen("in.txt", "r",原创 2012-12-03 14:51:29 · 639 阅读 · 0 评论 -
hdu 3003 背包
背包#include "stdio.h" #include "string.h" #include "stdlib.h" typedef struct _Node{ int price, value; struct _Node *next; }Node, *pNode; pNode brand[11]; int dp[11][10001]; int n, m,原创 2012-12-03 13:19:18 · 705 阅读 · 0 评论 -
HDU 4004
二分查找:在 0 和 L 之间,枚举距离,假设mm = (0 + L) >>1,然后每次用最长为mm的距离去跳,最后看跳完的次数是否满足条件,若不满足,则表明,#include "stdio.h" int l, n, m; int stn[500005]; void qsort(int st, int ed){ int s = st; int e = ed; in原创 2012-11-10 10:41:19 · 704 阅读 · 0 评论 -
基数排序
祈祷找个好工作……基数排序,按照从低位到高位,往桶子里塞(LSD)参考资料:http://baike.baidu.com/view/1170573.htm#include "stdio.h" #include "string.h" #include "stdlib.h" typedef struct _Node{ int num; int pos; struct原创 2012-09-06 15:25:13 · 364 阅读 · 0 评论 -
hdu 1150 二分图 最小点覆盖=最大匹配
到了算法会写,但看不懂题目要用啥算法的阶段……真是悲哀#include #include #include #define M 100int n, m, k;typedef struct _Node{ int to; struct _Node* next;}Node, *pNode;pNode map[M];int match[M];int visit原创 2012-08-28 21:53:52 · 476 阅读 · 0 评论 -
分治法 大数乘法
不知道有没有更高效的算法#include "stdio.h" #include "stdlib.h" #define M 100 typedef struct _Node{ int s[M]; int l; int c; }Node, *pNode; void cp(pNode src, pNode des, int st, int l){ int i,原创 2012-09-04 22:09:22 · 2554 阅读 · 0 评论 -
LCA <O(N logN, O(logN)>
参考资料:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor#Another这里加上了RQM转LCA,可以参考《RMQ转换成LCA 》。这个算法的思想与上一篇《LCA 》的思想一样:1、求出树中每个节点的lev(树中的高度)以及每个节点的pare(节点的父亲)。2、假原创 2012-08-23 15:28:51 · 1531 阅读 · 0 评论 -
LCA <O(N), O(sqrt(N))>
参考资料:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor#Another easy solution in O(N logN, O(logN)算法思想:1、求出每个节点i的父亲t[i]和在树中的深度l[i]2、将树按sqrt(n)高度划分成sqrt(n)+0|1块原创 2012-08-22 16:27:18 · 1777 阅读 · 0 评论 -
RMQ转换成LCA <O(N), O(1)>
参考资料:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor#A O(N), O(1) algorithm for the restricted RMQ#include "stdio.h"#include "stdlib.h"#define M 100int原创 2012-08-21 10:28:34 · 1906 阅读 · 0 评论 -
【复习】最大连续子区间 最长递增字串
不熟练的原因是理解的不够深……#include #include #define MAX(a, b) ((a)>(b)?(a):(b))int num[100] = {-1, 2, 5, -4, 3, 0, -1, 3, 6, -10};int n = 10;int func1(){ int i; int max = 0x80000000, sum = 0;原创 2012-08-29 16:50:03 · 1054 阅读 · 0 评论 -
RMQ DP
最原始的DP,空间和时间复杂度O(n^2)。在线#include "stdio.h"#include "string.h"#define M 100#define MIN(a, b) ((a)<(b)?(a):(b))int num[M] = {2, 1, 67, 33, 53, 21, 6, 35, 44, 61};int n = 10;int dp[M][M];v原创 2012-08-17 11:49:03 · 385 阅读 · 0 评论 -
hdu 2079 母函数
母函数很有意思参考资料:http://www.wutianqi.com/?p=596#include "stdio.h"#include "string.h"void main(){ int c; int n, k; int a[9], b[9]; int i, j, z, p; int ccc[41]; int t[41]; freopen("in.txt",原创 2012-07-11 16:04:28 · 456 阅读 · 0 评论 -
hdu 2570 DP或贪心
折腾了一上午……dp[i][j]表示第i罐结束时,体积为j的“浓度”,注意这里的浓度不是平时意义的浓度,这里指的是“纯药液”将两瓶液体混合,体积分别是kv和zv,浓度分别是a和b,混合后的浓度为:(kv*a + zv*b)/(kv+zv),化简之后就是(ka+zb)/(k+z),然后解释起来就是:k+z份的纯药液(ka+zb),不含水……这题本身是让用贪心做,一开始没看出来,直接用DP原创 2012-07-11 11:42:59 · 493 阅读 · 0 评论 -
hdu 2569 DP
1、注意用__int642、别少考虑情况dp[i][j][k] 表示 当前第i段颜色为j,且第i-1段的颜色为k时的方法数。然后按照题目要求写状态转移,很好理解#include "stdio.h"#include "string.h"void main(){ int n, k, i, j; __int64 dp[40][3][3], s; freopen原创 2012-07-10 16:26:06 · 398 阅读 · 0 评论 -
hdu 1405 Presentation Error (PE)
谨此提醒PE的同学:题目给的Sample在最后一组数据的末尾是没有空格的,而实际要加上一个空格。#include "stdio.h"#include "string.h"#include "math.h"int prime[65536];int count[65536];void main(){ int i, j; int num; int t; int f原创 2012-06-11 14:56:01 · 798 阅读 · 0 评论