自定义博客皮肤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)
  • 收藏
  • 关注

原创 HDU 4772 Zhuge Liang's Password 选择矩阵

本题需要使用选择矩阵的程序求解,这个和Leetcode上的一个程序是一样道理的。如果使用额外空间,那么是很容易做到的,这里不使用额外空间,直接使用到位操作,空间效率是O(1),这是个非常漂亮的到位旋转程序。题意还是很重要,这次看错了一句话,就WA了一次:The maximum amount of cells which contains two equal numbers after ov

2014-08-15 21:52:16 922

原创 HDU 4709 Herding 几何题解

求所有点组成的三角形最小的面积,0除外。本题就枚举所有可以组成的三角形,然后保存最小的就是答案了,因为数据量很少。复习一下如何求三角形面积。最简便的方法就是向量叉乘的知识了。而且是二维向量叉乘P1(ax, ay), P2(bx, by),公式为:|P1 X P2| = abs(ax*by - ay*bx)三角形面积就是|P1 X P2| / 2;本题也是float过不了,换成d

2014-08-15 20:38:04 984

原创 HDU 1025 Constructing Roads In JGShining's Kingdom LIS题解

本题是LIS题解。主要是理解他的题意。他的题意都好像比较隐晦,比如每个poor city和rich city一定是需要对应起来的,比如poor city和rich city并不是按顺序给出的。其实是可以把数列按照poor city排序,然后求rich city城市号的最大递增子序列。不过这里不用排序,利用hash的思想直接对应起来就可以了。然后就是本题是卡DP的O(n*n)的解法的,这

2014-08-15 16:43:14 838

原创 HDU 1024 Max Sum Plus Plus Dp题解

本题就是求m段子段,而且要求这些子段加起来和最大,最大子段和的Plus版本。不过题意真的不好理解,x,y什么的都没有说清楚。知道题意就开始解题了,这肯定是动态规划法了。动态规划法的程序不难写,关键是抽象思维。这里的最小情况是只分成一段的时候,就退化为最大子段和问题了,这个是段数的最小情况了; 如果只有0个数的时候,结果肯定为零了,或者如果只有一个数的时候就是这个数了,那么数列只有0

2014-08-15 13:38:23 2351

原创 HDU 1023 Train Problem II 大数打表Catalan数

一个出栈有多少种顺序的问题。一般都知道是Catalan数了。问题是这个Catalan数很大,故此需要使用高精度计算。而且打表会速度快很多,打表公式要熟记:Catalan数公式 Cn=C(2n,n) / (n+1);递推公式 C(n ) = C(n-1)*(4*n-2) / (n+1)高精度乘以一个整数和高精度除以一个整数的知识,这样还是使用整数数组比较好计算,如果使用str

2014-08-15 10:48:16 981

原创 POJ 1590 Palindromes 肯爹题

本题就是专门肯人的题目,给出的列子也是故意误导人的。其实就考一点:没有mirror的字母存在的时候就可以判定整个字符串不是mirror!如下面的mirrored string的叙述:A mirrored string is a string for which when each of the elements of the string is changed to its rever

2014-08-14 14:52:35 1029

原创 POJ 3974 Palindrome Manacher算法题解

本题就是求最长的回文子串。字符串超长,不过限时却是也很长的15秒,最长的限时之一题目了,如果限时短点的话,估计能过的人不多。使用Mancher算法是可以秒杀的。模板式的Manacher算法:#include #include #include #include #include #include #include #include #include #includ

2014-08-14 11:44:21 975

原创 POJ 1276 Cash Machine 背包题解

典型的多重背包的应用题解。可以使用二进制优化,也可以使用记录当前物品的fangf

2014-08-13 16:43:57 790

原创 HDU 2546 饭卡 01背包问题

01背包问题,增加一个额外条件,余额大于等于5的时候,可以购买任意价格的东西,那么就把5保留下来买最大价格的物品。然后转化为收益的时候要注意初始条件,即没买东西的时候收益就是余额,就是所有的钱。这个还是有点难转换思维的。最后是要熟悉背包填表,不需要保留选择的时候,就逆向填表,只需要一维表就可以了,当然也可以使用滚动数组,两个一维数组就可以了。走了算法一圈回来了,AC自动机,线段树等都学

2014-08-13 09:34:45 992

原创 HDU 1231 最大连续子序列 DP题解

典型的DP题目,增加一个额外要求,输出子序列的开始和结尾的数值。增加一个记录方法,nothing special。记录最终ans的时候,同时记录开始和结尾下标;更新当前最大值sum的时候,更新开始节点。const int MAX_N = 10001;long long arr[MAX_N];int N, sta, end;long long getMaxSubs(){

2014-08-12 21:52:28 1107 2

原创 HDU 2594 Simpsons’ Hidden Talents KMP题解

KMP的应用。直接使用s1产生next 数组,然后在s2中搜索s1,那么记录最后一个搜索到的数值,就是s1的前缀在s2中的最长后缀了。本题应该不能直接调用strstr了吧。#include #include #include #include #include #include #include #include #include #include #include

2014-08-12 17:13:17 811

原创 HDU 2087 剪花布条 KMP题解

KMP的应用,不过查找的时候注意一点就够了:查找到一个子串的时候,直接跳过整个串,而不是使用next数组前跳,因为根据题意需要剪出小饰条,小饰条之间不能重叠。const int MAX_N = 1001;char txt[MAX_N], pat[MAX_N];int next[MAX_N], len;void genNext(){ for (int i = 1, j = 0

2014-08-12 16:24:47 964

原创 POJ 2752 Seek the Name, Seek the Fame KMP题解

本题是KMP的next数组的灵活运用。具体就是看最后整个数列的最后一个字母,能有多少前缀。理解了next数组就很容易了。#include #include #include using std::vector;const int MAX_N = 400001;char name[MAX_N];int next[MAX_N], len;void genNext(){

2014-08-12 15:46:00 1022

原创 POJ 1579 Function Run Fun 记忆化递归

典型的记忆化递归问题。这类问题的记忆主要是利用数组记忆,那么已经计算过的值就可以直接返回,不需要进一步递归了。注意:下标越界,递归顺序不能错,及时判断是否已经计算过值了,不要多递归。或者直接使用动态规划法填好表也是可以的。#include #include const int MAX_N = 21;int W[MAX_N][MAX_N][MAX_N];int g

2014-08-12 09:23:30 1105

原创 HDU 1022 Train Problem I 模拟栈题解

火车进站,模拟一个栈的操作,额外的栈操作,查看是否能按照规定顺序出栈。数据量很少,故此题目很容易AC。直接使用数组模拟就好。#include const int MAX_N = 10;char inOrder[MAX_N], outOrder[MAX_N], stk[MAX_N];bool rs[MA

2014-08-12 00:48:03 1083

原创 HDU 4883 Best Coder Round 2 TIANKENG’s restaurant 题解

有一组数据是客人到来和离开的时间,问需要多少张桌椅才能满足所有客人都能有位置坐的要求。暴力法就需要O(n*n)的时间效率了,显然是会超时的,故此需要O(n) 或者O(nlgn)的算法。属于一道想透了就非常容易的,但是没想过就会非常困难的题目。解法是:把所有客人到来和离开的时间都排成序列,每次客人到来需要n张桌椅,那么就+上n,每次客人离开就会返还n张桌椅,那么就-去n,求这样

2014-08-11 19:51:45 953

原创 POJ 3080 Blue Jeans KMP解法

使用KMP寻找最长的前缀的方法,比一般的暴力法有快了很多。本题一般的暴力法需要的是O(m*n*n*n),其中m是有多少字符串,而n是字符串长度,而使用KMP就可以把时间效率提高到O(m*n*n),减少了一个n,提高了一个档次啦。速度快很多。准确来说应该是利用KMP寻找一个字符串A,在另一个字符串B任意位置出现的A的最长的前缀字符串。理解好KMP的next table就好办了。每次查找到相等字符的时候,保存好最长的前缀。注意本题的条件:选取最前的字典顺序输出。老害我错的条件。

2014-08-11 11:08:18 1565

原创 POJ 3984 迷宫问题 搜索题解

本题可以使用BFS和DFS解题,也可以构建图,然后利用Dijsktra解题。不过因为数据很少,就没必要使用Dijsktra了。BFS和DFS效率都是一样的,因为都需要搜索所有可能的路径,并记录最短路径和当前路径。推荐使用DFS,感觉会方便很多,BFS会麻烦很多,因为需要记录并比较路径。#include #include #include const int MAX_

2014-08-11 10:23:30 1399

原创 POJ 3670 Eating Together 二分解法O(nlgn)和O(n)算法

本题就是一题LIS(最长递增子序列)的问题。本题要求求最长递增子序列和最长递减子序列。dp的解法是O(n*n),这个应该大家都知道,不过本题应该超时了。因为有O(nlgn)的解法。但是由于本题的数据特殊性,故此本题可以利用这个特殊性加速到O(n)的解法,其中的底层思想是counting sort分段的思想。就是如果你不会counting sort的话,就很难想出这种优化的算法了。

2014-08-09 22:17:27 1163

原创 POJ 3616 Milking Time DP题解

典型的给出区间任务和效益值,然后求最大效益值的任务取法。属于一维DP了。一维table记录的数据含义:到当前任务的截止时间前的最大效益值是多少。注意, 这表示当前任务一定要选择,但是最终结果是不一定选择最后一个任务,故此最后需要遍历找到table数组的最大值,当然计算过程中使用一个数记录最终最大值也是可以的。状态转移方程就是: tbl[i] = MAX({from tbl[0]->

2014-08-09 00:39:51 1338 4

原创 POJ 3280 Cheapest Palindrome DP题解

看到Palindrome的题目,首先想到的应该是中心问题,然后从中心出发,思考如何解决。DP问题一般是从更加小的问题转化到更加大的问题,然后是从地往上 bottom up地计算答案的。能得出状态转移方程就好办了,本题的状态转移方程是:if (cowID[i] == cow{j]) tbl[id][i] = tbl[id][i+1];//相等的时候无需改动else tbl[id][i

2014-08-08 22:44:55 1272

原创 POJ 1088 滑雪 记忆化优化题解

本题有人写是DP,不过和DP还是有点差别的,应该主要是记忆化 Momoization 算法。思路就是递归,然后在递归的过程把计算的结果记录起来,以便后面使用。很经典的搜索题目,这种方法很多题目考到的。关键还是如何把代码写清晰工整了,O(∩_∩)O~。#include const int MAX_N = 101;int R, C;int arr[MAX_N][MAX_N];i

2014-08-08 19:43:02 1188

原创 POJ 1050 To the Max DP题解

一维最大字段和的扩展。要诀是固定列的左右点,比如左边记录为left, 右边记录为right,那么一个循环left从0到COL,行最大值,那么right从left开始循环到COl,就可以考虑到所有列组合了,这个循环是O(n*n),然后求范围列内的行最大子段和,时间是O(n),这样巧妙地把二维的问题转化为一维了,最终时间复杂度是O(n^3)。可以参考Geeks上的讲解,不过他的最大

2014-08-08 17:26:31 1018

原创 HDU 3065 病毒侵袭持续中 AC自动机题解

其实本题比HDU的病毒侵袭1还简单,不过有一个陷阱卡到我了:就是搜索text的时候,当遇到的字母不是大写字母的时候,那么就要重新从根节点开始搜索,否则就会答案错误。那么一点陷阱,居然没想到啊。教训啊:看来对不太平常的地方,需要更加深入的思考,才能发现其中的陷阱,否则就WA了。#include #include #include using std::queue;con

2014-08-07 22:23:36 904

原创 HDU 2896 病毒侵袭 AC自动机题解

本题是在text里面查找key word的增强版,因为这里有多个text。那么就不可以简单把Trie的叶子标志记录修改成-1进行加速了,可以使用其他技术,我直接使用个vis数组记录已经访问过的节点,达到加速效果,速度还算挺快的。不过看discuss里面有人直接使用Trie,做出了140ms的速度,而且他的程序严格来说并不正确,可见本题的数据很水啊。Trie的时间效率肯定比AC自动机低,但是

2014-08-07 20:07:08 1162

原创 POJ 1204 Word Puzzles AC自动机题解

AC自动机的灵活运用,本题关键是灵活二字。因为数据不是很大,时间要求也不高的缘故,所以本题有人使用暴力法也过了,有人使用Trie,然后枚举八个方向,也过了,不过速度很慢。当然有人使用AC自动机没AC的,在讨论区里喊AC自动机超时的,那是因为不会灵活运用,或者是硬套模板的,AC了速度也不会快。给出本人的算法思路:1 把需要查找的关键字建立Trie, 然后构造AC自动机2 查找的时候分八个方向查找,比如棋盘是board[N][M],那么就可以循环i(0->N-1),然后每次把board[i]当做一个

2014-08-07 15:35:34 1611

原创 HDU 2222 Keywords Search AC自动机入门题

单词统计的题目,给出一些单词,统计有多少单词在一个文本中出现,最经典的入门题了。AC自动机的基础:1 Trie, 以这个数据结构为基础的,不过增加一个fail指针和构造fail的函数2 KMP,不是直接运用KMP,而是需要KMP的思想,KMP思想都没有的话,理解这个算法会更加吃力的。注意本题的单词会有重复出现的,一个单词只能统计一次。搜索了一下网上的题解,发现好多代码都

2014-08-07 10:25:08 1902

原创 POJ 3450 Corporate Identity KMP题解

本题要求求一组字符串的最长公共子串,其实是灵活运用KMP快速求最长前缀。注意肯爹的题意:要求按照字典顺序输出。还有要提醒的就是:有人也是用KMP来解这道题,但是很多人都把KMP当成暴力法来用了,没有真正处理好细节,发挥KMP的作用。而通常这些人都大喊什么暴力法可以解决本题,没错,的确暴力法是可以解决本题的,本题的数据不大,但是请不要把KMP挂上去,然后写成暴力法了,那样会误导多少后来人啊。

2014-08-06 19:30:16 914

原创 POJ 2608 Soundex 基础题题解

基本的编程能力考查。注意:1 下标处理2 审查题意,并严格根据题意去重。3 如何把代码写清晰精简。#include #include const short MAX_LETTER = 21;const short ALP_LEN = 26;short Letter[ALP_LEN] = {-1, 1, 2, 3, -1, 1, 2, -1, -1, 2, 2, 4, 5

2014-08-06 12:31:19 1001

原创 POJ 1163 The Triangle DP题解

寻找路径,动态规划法题解。本题和Leetcode的triangle题目差不多一样的,本题要求的是找到最大路径和。逆向思维,从底往上查找起就可以了。因为从上往下可以扩展到很多路径,而从下往上个点的路径是由两条缩减到一条。这样就可以很简单记录最大路径了。#include const short MAX_ROW = 101;short triangle[MAX_ROW][MAX_

2014-08-06 10:22:37 1068

原创 HDU 1618 Oulipo KMP题解

给出两个字符串,寻找一个字符串在另外一个字符串出现的频率。原来kmp还有一个陷阱,下面注释出了,下标没步进好,就有一定几率出现超时的,也有一定几率出现错误,视具体的串而定。修改一下就好了,kmp速度是很快的。#include #include const int MAX_TXT = 1000001;const int MAX_WORD = 10001;int

2014-08-05 23:34:42 952

原创 HDU 1711 Number Sequence KMP题解

KMP查找整数数列,不是查找字符串。原理是一样的,不过把字符串转换为数列,其他基本上是一样的。#include #include const int MAX_N = 1000001;const int MAX_M = 10001;int strN[MAX_N], strM[MAX_M], next[MAX_M], N, M;void getNext(){ mems

2014-08-05 21:29:05 984

原创 HDU 4760 Good FireWall 完善Trie题解

本题乍看像是线段树之类的区间操作,不过因为只是需要查找ip的前缀,故此其实是使用Trie来做。挺高难度的Trie应用,做完这道题之后说明Trie功力有一定火候了。这里的Trie使用到了Delete函数,这是个Trie函数中最难的函数了,当然要使用数组记录的方法水掉,也是可以的。这里不水,给出delete函数。考点难点:1 Trie的操作函数的灵活运用,主要难点是delete函数的灵活运用2 在叶子节点所有的group id, 删除的时候要注意,不能一气删除了,有多个group id会挂在同一颗树

2014-08-05 10:47:44 1149

原创 HDU 1251 统计难题 Trie题解

基本上是标准的寻找前缀的问题,只需要insert和search函数就可以了。我这里主要是修改一下n的记录方法,这里的n代表的不是叶子节点的标志,而是有多少单词经过了这条路径的标志。然后是查找需要查找的前缀单词,如果没有找到,就返回0,表示没有单词以这个前缀单词为前缀,如果找到,直接返回n就是答案了。因为有n个单词经过了这条路径。查找效率是常数。使用静态分配空间的办法。#

2014-08-04 19:20:18 1256

原创 POJ 3630 Phone List Trie题解

Trie的应用题目。本题有两个难点了:1 动态建立Trie会超时,需要静态建立数组,然后构造树2 判断的时候注意两种情况: 1) Tire树有133,然后插入13333556的时候,2)插入顺序倒转过来的时候修改一下标准Trie数的插入函数就可以了:#include #include const int MAX_NODE = 100001;const int M

2014-08-04 16:44:22 1094

原创 HDU 1075 What Are You Talking About Trie题解

翻译火星语,不过火星语也是使用英文单词的,就是把一个单词对应到另外一个单词。可以使用map, 使用二分,方法很多。不过最快的应该都是Trie解法了。把火星语挂在Trie树中,然后在叶子节点增加一个string容器,装英语单词。查找的时候,找到了出现在Trie中的火星语,就返回string就可以了。#include #include #include using n

2014-08-04 10:09:30 1061

原创 HDU 1247 Hat’s Words Trie题解

使用Trie的insert函数,主要是要灵活修改search函数,使得q

2014-08-04 08:17:55 1078

原创 POJ 2488 A Knight's Journey 递归回溯题解

简单的递归回溯法,锻炼基本的编程能力。这类题是对代码能力的要求比对思想的要求高点。而且要审题,题目要求安lexicographically 顺序输出,不小心递归的顺序就会输出错误了。棋盘是由数字列或者行,和字母列或者行组成的,故此输出结果要注意。#include #include const int MAX_N = 27;bool board[MAX_N][MAX_N

2014-08-03 16:38:45 1073

原创 POJ 1936 All in All 题解

寻找一个串是否是另外一个字符串的子串序列。可以想象主串是一连发子弹,而需要查找的子串是一队敌人,然后主串的字符是目标,把主串的所有子弹打完,是否能把子串的所有敌人消灭掉。很简单的题目。#include const int MAX_N = 100001;char seq[MAX_N], subSeq[MAX_N];int main(){ while (~scanf("%s %

2014-08-03 15:25:24 1286

原创 POJ 3080 Blue Jeans 三种暴力法

本题可以使用暴力法直接求解,思路也挺简单的,不过实现起来也挺麻烦的。本题最暴力直接使用strstr过。 这里使用hash表的方法过,这种方法好像有个学名的,主要思路就是把一个需要查找的字符串赋予一个数值,那么就可以把一串字符串的比较转换为一个值的比较了,那么就可以加速字符串的查找了。#include #include #include const long long MOD = (

2014-08-03 13:07:30 1268

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关注的人

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