自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

靖空间

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

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

原创 HDU 1867 A + B for you again KMP题解

本题又是一个典型的KMP应用。求两个字符串相加的结果,相加的规律是一个字符串的后缀和另一个字符串的前缀相同,就可以合并这个部分。不过本题的题意不是很清晰,因为没有太明确指出这两个字符串的出现顺序是无关的,只是需要输出合并后长度最短的结果,如果合并后长度一样,那么就按照字典顺序,输出字典顺序在前的字符串。思路:1 使用kmp在s2查找s1,那么最终结束的时候next table的值就

2014-08-31 16:32:16 1057

原创 Codeforces 463C Gargari and Bishops 题解

题目出处: http://codeforces.com/contest/463/problem/C感觉本题还是挺难的,需要好好总结一下。计算对角线的公式:1 右斜对角线,也叫主对角线的下标计算公式: int index = j-i; 但是为了不使用绝对值,并且分开j = 2, i = 1和j = 1, i = 2的情况,那么公式变为: j-i+n,正方形n为行数或列数2 左

2014-08-31 12:50:18 2034

原创 POJ 3181 Dollar Dayz 01完全背包问题

01完全背包问题。主要是求有多少种组合。二维dp做的人多了,这里使用一维dp就可以了。一维的转换方程:dp[j] = dp[j-i] + dp[j];其中i代表重量,j代表当前背包容量。意思就是dp[j-i] 代表j-i背包重量的时候最多的组合数,那么如果到了背包容量为j的时候,就是可以把第i个物品装进背包,那么就有dp[j-i]种装法,如果没有i物品之前,那么容量为j的

2014-08-29 11:13:47 1299

原创 HDU Bone Collector 2620 01背包

01背包模板式的题目,套模板或者直接敲就可以了。Bone Collector#include #include #include #include #include #include #include #include #include #include #include using namespace std;const int MAX_N =

2014-08-28 16:46:12 1371

原创 HDU 1203 I NEED A OFFER! 01背包题解

本题题目居然写错了也没改正,囧,应该是AN OFFER!题解就是dp加上概率论求解。因为需要求最少有一间学校录取的概率,那么就可以使用逆向思维,求没有一间学校录取的概率。基本的概率论思维,不过如果久了没做概率论还是会有点麻烦的。然后就是标准的01背包求解了:#include #include #include #include #include #include

2014-08-28 16:21:13 1157

原创 Heap 3214 LIS题解

根据问题转换成最长不降子序列问题。10^9的输入数据计算起来还是挺花时间的。因为这里只能使用O(nlgn)时间复杂度了。不过证明是可以算出10^9个数据的。因为时间限制是5s.#include #include #include #include #include #include #include #include #include #include #include

2014-08-27 10:33:42 933

原创 HDU 1059 Dividing dp背包题解

背包问题,这一类问题应用很广了。本题可以根据特例优化一下。#include #include #include #include #include #include #include #include #include #include #include using namespace std;const int MAX_N = 20001;const int

2014-08-25 15:23:03 1126

原创 HDU 1051 Wooden Sticks 贪心题解

本题一看就知道是最长不减序列了,一想就以为是使用dp解决了。不过那是个错误的思路。我就动了半天没动出来。然后看了看别人是可以使用dp的,不过那个比较难证明其正确性,而其速度也不快。故此并不是很好的解决方法。所以我就直接硬算,硬模拟选择出非减子序列,选完就出答案了。思路:1 按照长度排序2 按照不减原则选择重量,选一个,消灭一个。最后消灭完了,就处理完毕,答案就自然出来了。

2014-08-24 10:11:27 1208

原创 POJ 1952 BUY LOW, BUY LOWER DP记录数据

最长递减子序列,加记录有多少个最长递减子序列,然后需要去重。最麻烦的就是去重了。基本的思路就是:全面出现重复的值,然后还是相同长度的子序列,这里的DP记录的子序列是以当前值为结尾的时候,并且一定选择这个值的最长递减子序列, 那么就需要减去前面已经出现过了的子序列。有点绕口。举例就是9 8 9 8 2 和 10 5 12 5 3;这些例子去重。本类型的题目如果不用记录数据是可以使

2014-08-24 00:16:53 1148

原创 HDU 1047 Integer Inquiry 大数相加 string解法

本题就是大数相加,题目都不用看了。不过注意的就是HDU的肯爹输出,好几次presentation error了。还有个特殊情况,就是会有空数据的输入case。#include #include #include #include #include #include #include #include #include #include #include using

2014-08-23 00:14:21 1416

原创 HDU 1045 Fire Net 二分图Bipartite题解

本题可以使用DFS直接爆搜出答案,不过这样类型的题目其实是个二分图的题解。这个二分图,难不在Hungary算法,而是难在于建图。需要挺高的抽象思维的。建图:1 把同一行不被X分开的格子标同一个号码,被X分开的标下一个号码,这样做是为了缩点,不需要把所有的格子都分开标号,而且可以更方便建个更加小的图。2 同理把同一列的格子标号3 然后判断相同一个格子的行标号和列标号是有路径的,其

2014-08-22 23:13:49 1175

原创 HDU 1041 Computer Transformation 数学DP题解

本题如果编程是使用DP思想直接打表就可以了。如果是找规律就需要数学思维了。规律就是看这些连续的0是从哪里来的。我找到的规律是:1经过两次裂变之后就会产生一个00; 00经过两次裂变之后也会产生新的00;故此需要记录好1和00出现的次数就可以递推出后面的00出现的数据了。公式就是tbl00[i] = tbl00[i-2] + tbl1[i-2]; 其中tbl00是记录00出现的次数,

2014-08-22 11:17:59 1394

原创 HDU 1035 Robot Motion Union Find 并查集题解

本题的类型我一看就想到使用并查集解了,因为要查找是否有环,这是并查集的典型用法。但是由于本题数据实在是太水了,故此有人使用直接模拟都过了。这让本题降了个档次。这里使用并查集解。而且可以根据需要简化并查集函数,代码还是很好打的。#include #include #include #include #include #include #include #includ

2014-08-21 16:43:13 989

原创 HDU 1034 Candy Sharing Game 模拟题

一个分糖游戏,找了会规律,没找到,只能直接模拟玩了。果然0ms过了,看来数据不大,只是考编码能力罢了。#include #include #include #include #include #include #include #include #include #include #include using namespace std;int main(

2014-08-21 11:11:57 1192

原创 Codeforces Little Dima and Equation 数学题解

B. Little Dima and Equationtime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputLittle Dima misbehaved during a

2014-08-21 09:02:26 2557 2

原创 HDU 1031 Design T-Shirt 选前k大

相当于给出一组数列,然后选择前K大的数的算法。本题没有给出详细的数据,故此就使用动态分配空间的方法了。而这种题最好的算法就是使用快排思想,期望时间效率就是O(n)了。最基本入门解决这种题的算法是直接排序了。那就成了水代码了。用上快排的思想才能体现出水平。不过这种快排实在考的太多了,建议一定要掌握。每次做这个算法的题目总会要调试一定时间的,每次都出现奇葩的错误。看来还是不够细心。

2014-08-20 20:58:14 1035

原创 HDU 1030 Delta-wave 数学题解

给出一个数字塔,然后求沿着数字之间的边走,给出两个数字,问其路径最短的长度是多少。看似一条搜索题目,不过有一定做题经验的人都知道,这个不是搜索题,直接搜索肯定超时。这个是根据规律计算的数学题目。我这里的思路是一层一层往下搜,利用层间的规律加速,实现层跃,到了同一层,或者同一个对角列的时候就可以直接计算出结果了。对角列即顺着三角形的边能直接走到目标的列。数学计算出层与层之间相差2,而

2014-08-20 12:58:57 1213

原创 HDU 1027 Ignatius and the Princess II 选择序列题解

直接选择序列的方法解本题,但是最坏时间效率是O(n*n),故此不能达到0MS。使用删除优化,那么就可以达到0MS了。删除优化就是当需要删除数组中的元素为第一个元素的时候,那么就直接移动数组的头指针就可以了,那么时间效率就是O(1)了,而普通的删除那么时间效率是O(n),故此大大优化了程序。如何直接选择第k个序列,可以参考本博客的Leetcode题解。Leetcode题有个一模一样的题目

2014-08-20 08:38:25 1119

原创 HDU 1026 Ignatius and the Princess I 迷宫广搜剪枝问题

本题是个经典的迷宫广搜问题类型了。网上看到好多解法。很多解题报告都没什么分析,更不会指出其中的关键点。代码更加像一大抄。有人分析也一大篇分析,不过全部都不切中关键,甚至在分析什么广搜和深搜区别,广搜为什么快之类的,还有喊什么暴搜之类的,全错了。估计这些代码都是抄过的。通过一大段的时间研究,终于搞通了。本题虽然可以说是广搜,但是其中的关键却是剪枝法,为什么呢?因为迷宫并不能简

2014-08-19 12:06:02 1498

原创 POJ 2386 Lake Counting 搜索题解

简单的深度搜索就可以了,看见有人说什么使用并查集,那简直是大算法小用了。因为可以深搜而不用回溯,故此效率就是O(N*M)了。技巧就是增加一个标志P,每次搜索到池塘,即有W字母,那么就认为搜索到一个池塘了,P值为真。搜索过的池塘不要重复搜索,故此,每次走过的池塘都改成其他字母,如'@',或者'#',随便一个都可以。然后8个方向搜索。#include #include #inc

2014-08-15 23:04:56 1119

原创 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 810

原创 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 1564

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

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

2014-08-11 10:23:30 1398

原创 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 1162

原创 POJ 3616 Milking Time DP题解

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

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

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

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