自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

靖空间

降低成功的时间复杂度,提高生活的空间复杂度

  • 博客(778)
  • 资源 (5)
  • 收藏
  • 关注

原创 POJ 1384 Piggy-Bank 背包DP

所谓的完全背包,就是说物品没有限制数量的。怎么起个这么intimidating(吓人)的名字?其实和一般01背包没多少区别,不过数量可以无穷大,那么就可以利用一个物品累加到总容量结尾就可以了。本题要求装满的,故此增加个限制就可以了。

2014-07-01 10:16:34 838

原创 POJ 1611 The Suspects 并查集 Union Find

本题也是个标准的并查集题解。操作完并查集之后,就是要找和0节点在同一个集合的元素有多少。注意这个操作,需要先找到0的父母节点,然后查找有多少个节点的额父母节点和0的父母节点相同。这个时候需要对每个节点使用find parent操作,因为最后状态的时候,节点的parent不一定是本集合的根节点。#include const int MAX_N = 30001;stru

2014-06-30 18:57:19 1223

原创 POJ 2524 Ubiquitous Religions Union Find 并查集

本题是标准的并查集了,最后利用这些集求有多少独立集。所以这里也写个标准程序过了。最后查找独立集合: 看有多少个节点的父母节点是自己的,那么就是独立集合了。自己做自己的父母当然最独立的了,没有任何依赖,呵呵。#include const int MAX_N = 50001;//const int MAX_M = MAX_N/2 * (MAX_N-1) + 1;int N, M;

2014-06-30 18:56:14 897

原创 POJ 1182 食物链 Union Find题解

Union Find就是所谓的并查集。本题做的很无语,最后发现居然是输入搞错,一直WA。不能使用循环接受输入,否则是WA的,气死人,浪费那么多时间就为了这个。难点:1 构建关系树2 构建公式3 快速更新公式要抽象思维出什么对应什么的关系和上面是逆关系,就是利用0,1,2构建出父子节点之间的关系值,我是这样去思考构建出准确无误的公式的。这样的抽象度是挺高的,需要多多训

2014-06-30 15:27:52 938

原创 POJ 1014 Dividing 背包

二进制优化,其实是物体的分解问题。就是比如一个物体有数量限制,比如是13,那么就需要把这个物体分解为1, 2, 4, 6如果这个物体有数量为25,那么就分解为1, 2, 4, 8, 10看出规律吗,就是分成2的倍数加上位数,比如6 = 13 - 1 - 2 - 4, 10 = 25 - 1 - 2 - 4 - 8,呵呵,为什么这么分解?因为这样分解之后就可以组合成所有1到13的数,为25的时候可以组合成所有1到25的数啦。就是这么一个分解物体,最后组合的问题。不明白?给多几个数字组合:31分

2014-06-29 18:49:51 963

原创 HDU 2824 The Euler function 题解

求区间的euler数值,自然使用筛子法了。Problem DescriptionThe Euler function phi is an important kind of function in number theory, (n) represents the amount of the numbers which are smaller than n and coprim

2014-06-29 12:45:37 1537

原创 POJ 2478 Farey Sequence

DescriptionThe Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/b with 0 F2 = {1/2} F3 = {1/3, 1/2, 2/3} F4 = {1/4, 1/3, 1/2, 2/3, 3/4} F5 = {1/

2014-06-29 10:58:25 1034

原创 POJ 2407 Relatives 欧拉函数题解

最基本的欧拉函数:欧拉函数:求小于n的与n互质的个数  欧兰函数公式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数  就是要求这样的式子啦,不过求这条式子,相信有很多种方法可以求,这个不是难题;不过问题是如何巧妙地求,如何简洁地写出代码。直接硬求,或者求出质因数之后求都不是巧妙的

2014-06-29 09:16:44 1233

原创 POJ 2349 Arctic Network 最小生成树题解

本题也是使用Prime和Kruskal都可以的最小生成树的题解。本题一点新意就是:需要除去最大的S-1个距离,因为可以使用卫星覆盖这些距离。技巧:建图建有向图,速度快点,不用计算两边。这里使用Prime,因为是稠密图。#include #include #include #include #include #include using std::sort;c

2014-06-28 20:25:01 1275

原创 POJ1258 Agri-Net MST最小生成树题解

搭建一个最小代价的网络,最原始的最小生成树的应用。这里使用Union find和Kruskal算法求解.注意:1 给出的数据是原始的矩阵图,但是需要转化为边表示的图,方便运用Kruskal,因为需要sort2 减少边,一个矩阵最多需要(N*N-N)>>1条边,有人讨论本题是否有向,那是无意义的,因为本题的最小生成树和方向无关。3 使用Union find是为了判断是否有环,比原

2014-06-28 09:21:05 1131

原创 POJ 3628 Bookshelf 2 题解

本题解法很多,因为给出的数据特殊性故此可以使用DFS和BFS,也可以使用01背包DP思想来解。这里使用BFS,缺点是比DFS更加耗内存,不过优点是速度比DFS快。当然也比DFS难写点:int N, B;int Height[21];inline int mMin(int a, int b) { return a > b? b : a; }inline int mMax(int a

2014-06-27 17:36:07 1064

原创 POJ 3624 Charm Bracelet 背包题解

最简单的背包问题了,本题应该除了背包就一个考点了:不能开二维数组。我没开过二维,不过看数据是不可以的。太大了。做法有两种改进省内存DP:1 所谓的滚动数组2 逆向填表很久没做背包DP,突然觉得这种背包问题很简单了。下面给出两种解法:1 calBag()是滚动数组2 calBag2()是逆向填表#pragma once#include #inclu

2014-06-26 21:17:09 1425

原创 POJ 2230 Watchcow 欧拉回路题解

本题就是以每个节点和节点之间建路,而且说明是无向图,不过这里有个技巧,就是根据题意把它当成有向图来做,就成了直接查找有向图的欧拉回路就可以了。因为题意是需要每条边都走两遍的,而且每次走的方向相反。观察出这点,那么这道题就好做啦,直接建图,Feury递归求解就可以了。建图注意需要建邻接表,不要建矩阵,因为建成矩阵,那么会很大很大,而根据题意,建成邻接表最多只需要5倍的顶点数。打印的顺序是

2014-06-26 15:59:29 1180

原创 TopCoder SRM 625 Incrementing Sequence 题解

本题就是给出一个数k和一个数组,包括N个元素,通过每次增加数组中的一个数的操作,最后需要得到1 - N的一个序列,不用排序。可以从暴力法入手,然后优化。这里利用hash表进行优化,最终得到时间效率是O(n*n)的算法,而且常数项应该很低,速度还挺快的。思路:1 如果数组A[i]在1 -N 范围内,就利用bool B[]记录,这个数已经找到了;2 如果A[i]的值之前已经找到了,

2014-06-26 10:40:46 1249

原创 POJ 1041 John's trip Euler欧拉回路判定和求回路

就是欧拉判定,判定之后就可以使用DFS求欧拉回路了。图论内容。这里使用邻接矩阵会快很多速度。这类题目都是十分困难的,光是定义的记录的数组变量就会是一大堆。#include #include #include #include using namespace std;struct Edge{ int ed, des; Edge(int e = 0, int d

2014-06-25 21:07:06 1173

原创 Design Pattern Iterator 迭代器设计模式

这个设计模式感觉非常简单,我们平时写程序的时候也是经常需要调用iterator的,C++和Java都是。所以感觉没什么特别的,就是需要模仿C++或者Java的iterator类的功能吧。这里简单写个,使用C++模仿Java的iterator一些功能,呵呵。首先我们有一个集合类,而这个集合类包含了其他类,当我们需要遍历这个集合类包含的类的时候,就好使用iterator功能了。比如有一

2014-06-25 16:13:39 1207

原创 Topcoder SRM625 题解

给出一个字符串求是palindrome和anagram的比率是多少。知识点:1 DBL_MAX 64位double的最长数大概是1.7E308,很大很大,比long long大上不知多少倍,故此大概能容纳150!的数值,不能容纳200!的数值2 偶数的时候,不能有字母重复为基数次,否则不能组成palindrome3 基数的时候,只能有且只有有一个字母重复为基数次,用于放在中

2014-06-25 09:39:11 1485

原创 POJ 2553 The Bottom of a Graph TarJan算法题解

本题分两步:1 使用Tarjan算法求所有最大子强连通图,并且标志出来2 然后遍历这些节点看是否有出射的边,没有的顶点所在的子强连通图的所有点,都是解集。Tarjan算法就是模板算法了。这里使用一个数组和一个标识号,就可以记录这个顶点是属于哪个子强连通图的了。然后使用DFS递归搜索所有点及其边,如果有边的另一个顶点不属于本子强连通图,那么就说明有出射的边。有难度的题目:

2014-06-24 20:25:23 954

原创 POJ 2528 Mayor's posters 离散化和线段树题解

本题就是要往墙上贴海报,问最后有多少可见的海报。其实本题的难点并不是线段树,而是离散化。因为数据很大,直接按原始数据计算那么就会爆内存和时间的。故此需要把数据离散化。比如有海报1 6   7 9   20 100  5 1000的原始数据,直接计算需要1-1000的内存,离散化之后只需要8内存,因为只有4组数据8个数。本题更进一步高级一点的离散化就是需要把不相邻的两个数据插入一

2014-06-24 12:37:54 1155

原创 HDU 1011 Starship Troopers 树DP

本题也是挺特别的题目,因为要递归到树的叶子节点然后初始化。一开始看题也很困难,以为只是一条路径的最大获利计算,使用保存路径,然后DP,结果WA了。原来本题是需要分路径探索的,就是说每一个分岔路都可以分兵探索下去,如果兵力不足就结束,看最大收益是多少。题目并没有说的那么清楚,也许看题目也考人的IQ吧,要放聪明点。本题是考人的递归能力,动态规划法能力,总结起来难度还是很高的。

2014-06-23 19:06:26 944 1

原创 SRM 624 Building Heights DivI 题解

和前面的题目差不多,具体看:http://community.topcoder.com/stat?c=problem_statement&pm=13211&rd=15857思路:1 排序2 计算当前建筑物数为i的时候,所有可能的最小建筑物修改数3 每次计算i+1的时候,所有可能的最小建筑物修改数4 同时可以比较得到i+1的时候最小修改数得到的程序也不复杂#include

2014-06-22 09:30:38 1216

原创 HDU 1269 迷宫城堡 最大强连通图题解

寻找一个迷宫是否是只有一个最大强连通图。使用Tarjan算法去求解,经典算法,必须要学习好,要自己创造出来是十分困难的了。参考资料:https://www.byvoid.com/blog/scc-tarjan/const int N = 10001;vector gra[N];stack stk;bool inStack[N];int dfsNum[N];int backT

2014-06-21 22:14:18 976

原创 TopCoder SRM624 BuildingHeightEasy 题解

本题题意就是求有一组建筑物,问把这些建筑物的M个都统一到同一高度,需要的最小修改高度是多少?题意隐含的意思就是因为是建筑物,所以不能减少,只能增加了。本题可以使用暴力搜索,因为数据量少。但是其实可以小排序,然后再求高度差的。排序之后从第M个建筑物开始搜索,第M个建筑物与前面M个建筑物组成的建筑物群肯定是当前最小修改高度了。一个题目要求的类和一个测试程序:#include

2014-06-21 15:16:51 1047

原创 Geeks - Range Minimum Query RMQ范围最小值查询

使用线段树预处理,可以使得查询RMQ时间效率在O(lgn)。线段树是记录某范围内的最小值。标准的线段树应用。Geeks上只有两道线段树的题目了,而且没有讲到pushUp和pushDown操作,只是线段树的入门了。参考:http://www.geeksforgeeks.org/segment-tree-set-1-range-minimum-query/我修改了一下他的程序,使用

2014-06-21 09:16:14 1385 2

原创 HDU4828 Grids 2014百度之星初赛题解

看看Catalan数的公式:为 Catalan(n) = C(2n, n) / n+1 = C(2n, n) - C(2n, n-1); (公式0)然后利用全排序表达:Catalan(n) = (2n)! / (n+1) * (n)!*n!;那么Catalan(n-1) = (2(n-1))! / n * (n-1)!(n-1)!;然后两者相除就得到:Catalan

2014-06-20 19:12:09 1143

原创 HDU 4107 Gangster Segment Tree线段树

这道题也有点新意,就是需要记录最小值段和最大值段,然后成段更新这个段,而不用没点去更新,达到提高速度的目的。本题过的人很少,因为大部分都超时了,我严格按照线段树的方法去写,一开始居然也超时。然后修补了两个地方就过了,具体修改的地方请参看程序。知道最大值段和最小值段,然后修补一下就能过了。不是特别难的题目。#include #include #include using na

2014-06-20 16:54:44 912

原创 HDU 1068 Girls And Boys 二分图题解

选择出一组学生,这组学生里面不能彼此之间有过恋爱史的。又是一个典型的二分图问题。不过需要把所有学生看成一组*2,然后求最大匹配,然后除以2. 这样其实建图的时候,建成有向图也是可以的了。而且也是给出了两个方向的点了。注意本题没有给出最大数是多少学生了,所以最好使用动态分配内存了。而且本题的输入处理也特别点,要处理好,用好scanf这个函数。

2014-06-20 09:48:29 1559

原创 HDU 2063 过山车 二分图题解

一个男女搭配的关系图,看可以凑成多少对,基本和最原始的一个二分图谜题一样了,就是 一个岛上可以凑成多少对夫妻的问题。所以是典型的二分图问题。使用匈牙利算法,写成两个函数,就非常清晰了。本程序还带分配释放程序,当然oj一般不需要。但是好的程序一定要。#include #include int K, M, N, a, b;int *linker;bool **gra, *use

2014-06-20 08:57:02 1091

原创 HDU 1010 Tempter of the Bone heuristic 剪枝法

本题就是考剪枝法了。应该说是比较高级的应用了。因为要使用heuristic(经验)剪枝法。要总结出这个经验规律来,不容易。我说这是高级的应用也因为网上太多解题报告都没有分析好这题,给出的程序也很慢,仅仅能过掉,由此看来很多人没有做好这道题。这里我需要更正一下网上流行的说法:奇偶剪枝法。其实本题使用奇偶剪枝法并不能太大提高速度,只能说仅仅让使用奇偶剪枝过掉。所以网上说本题使用奇偶剪枝的,其实并不能提高速度。原因:奇偶剪枝只能剪枝一次,不能在递归的时候剪枝,因为只要初始化位置符合奇偶性,那么之后的任

2014-06-19 21:10:58 896

原创 HDU 2444 The Accomodation of Students二分图判定和匈牙利算法

本题就是先判断是否可以组成二分图,然后用匈牙利算法求出最大匹配。到底如何学习一种新算法呢?我也不知道什么方法是最佳的了,因为看书本和大牛们写的匈牙利算法详细分析,看了差不多两个小时没看懂,最后自己直接看代码,居然不到半个小时看懂了。然后就可以直接拿来解题啦。比如topcoder上有这个算法的很详细的分析,真没看懂。代码居然比分析更清晰了?我也不好下结论。但是我觉

2014-06-19 14:28:35 1062

原创 Geeks - Check whether a given graph is Bipartite or not 二分图检查

检查一个图是否是二分图的算法使用的是宽度搜索:1 初始化一个颜色记录数组2 利用queue宽度遍历图3 从任意源点出发,染色0, 或14 遍历这点的邻接点,如果没有染色就染色与这个源点相反的颜色,如果已经染色并且和源点的值相反,那么就是合法点,如果是相同的颜色,那么就不能是二分图 参考:http://www.geeksforgeeks.org/bipartite-gra

2014-06-19 12:30:19 2314

原创 POJ 3252 Round Numbers 数学题解

DescriptionThe cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissors', 'Ro, Sham, Bo', and a host of other names) i

2014-06-18 19:13:27 1083

原创 Light OJ 1005 - Rooks 数学题解

本题有点像n-queen的问题的变形,不过和n-queen有本质的不同,因为简化了对角线,那么就可以使用数学的方法求解了。思考了我好久,终于发现这个是inclusion-exclusion原理的应用。1 当k等于0的时候为1, 当k等于1的时候,那么就等于n^22 可以这样选择的:先选择n^2中的一格,那么就剩下(n-1)^2格可以选择了,然后在选一格,那么又剩下(n-2)^2格选择了3 这样可以利用乘法原理得到f(n, k) = f(n^2, 1) * f((n-1)^2, 1) * f((n-2

2014-06-17 14:37:14 1431

原创 SPOJ 15. The Shortest Path 最短路径题解

本题就是给出一组cities,然后下面会询问,两个cities之间的最短路径。属于重复询问的问题,暂时我只想到使用Dijsktra+heap实现了。因为本题重复查询次数也不多,故此如果保存所有最短路径,那么是得不偿失了。所以还是重复使用Dijsktra吧。有没有更加好的办法处理重复查询问题呢?还没想到。本算法纯粹手工打造了,不使用stl,代码很长很长,光打一遍就会手软的,呵呵。

2014-06-17 12:29:46 1590

原创 HDU 1009 FatMouse' Trade题解

Problem DescriptionFatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean.The warehouse has N rooms. The i-th room con

2014-06-16 19:30:03 2604

原创 HDU 1061 Rightmost Digit题解

求一个大数N^N的值的最右边的数字,即最低位数字。简单二分法求解就可以了。不过注意会溢出,只要把N % 10之后,就不会溢出了,不用使用long long。#include int rightMost(int n, int N){ if (n == 0) return 1; int t = rightMost(n / 2, N); t = t * t % 10;;

2014-06-16 18:00:36 880

原创 design pattern Builder 建造者设计模式

其实设计模式可以学的很有意思的,不需要非得如此硬枯燥地去啃FOG的大部头,当然这些骨头啃啃也健康。本文利用建造者模式设计一个有趣的场景,一个利用这个模式去学功夫的过程,呵呵。首先设计一个基类,学功夫先要有基础嘛:class 功夫{public: virtual void 看招() = 0;};有了基础之后,我们就可以学习高级功法了,这里学习降龙十八掌,O(∩_∩)O

2014-06-16 15:31:05 1109

原创 Geeks 一般二叉树的LCA

不是BST,那么搜索两节点的LCA就复杂点了,因为节点是无序的。下面是两种方法,都写进一个类里面了。当然需要重复搜索的时候,可以使用线段树及多种方法加速搜索。#include #include using namespace std;class LCANormalTree{ struct Node { int key; Node *left, *right;

2014-06-16 10:49:18 1438

原创 Geeks LCA最低公共单亲节点

给出一颗二叉树,找到两个值的最小公共节点。假设两个值都会在树中出现。如果可能不会出现的话,也很简单,就查找一遍看两个值是否在树中就可以了。如果不在就直接返回NULL。基本思想:就是在二叉树中比较节点值和两个值的大小,如果都在一边(左边或者右边)那么就往下继续查找,否则就是都在同一边了,那么就可以返回这个节点了,这个节点就是最低公共单亲节点了。参考:http://www.geeksfor

2014-06-16 09:18:25 856

原创 HDU 1698 Just a Hook 线段树解法

很经典的题目,而且是标准的线段树增加lazy标志的入门题目。做了好久线段树,果然是practice makes perfect, 这次很畅快,打完一次性AC了。标志的线段树函数。主要是:更新的时候只更新到需要的节点,然后最后的时候一次性把所以节点都更新完毕。这也是线段树常用的技术。#include const int SIZE = 100005;struct Node

2014-06-15 21:30:09 751

OpenGL完美的心形

可以参考本人博客: http://blog.csdn.net/kenden23/article/details/27338943 是一个使用OpenGL FreeGlut画的一个完美的心形。

2014-05-28

简单Windows弹球程序

详细描述,请看下面博客: http://blog.csdn.net/kenden23/article/details/17268877

2013-12-14

第一人称3D镜头框架代码

http://blog.csdn.net/kenden23/article/details/14051187 这个博客讲解的代码框架。讲解的类部分另外下载,可在博客上找。

2013-11-02

第一人称3D镜头类

http://blog.csdn.net/kenden23/article/details/14051187 这个博客讲解的代码,可以实现一个3d漫游第一人称视觉的类。一个镜头类,可以控制3D视觉,实现漫游效果

2013-11-02

算法问题集合源文件 堆排序 吊桶排序 最大子段和等

这个是本博客算法专栏的部分.cpp源文件,方便大家打包下载,如果没有积分的话,可以到我博客粘贴,博客有完整的代码。 http://blog.csdn.net/column/details/billsalgorithm.html?page=1#12944927 这里是部分源文件,暂时没时间全部做好。 可以直接加入项目运行的,建议使用vs2012编译。

2013-10-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除