![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 64
ThunderSei
这个作者很懒,什么都没留下…
展开
-
求树中最长路径 树的直径
使用两次BFS,第一次BFS在任意位置,所找到的最远端点是直径的一个端点。第二次BFS从第一次BFS得到的最远端开始,两次得到的端点间的这条路径即为最长路径。 证明; 一:第一次BFS得到的最远端是直径的一个端点。 若开始点V是直径上的点,必然到达的最远端是直径上某端点(反证) 若不是则必然与直径相交,若从V至最远端的这条路径与直径不相交,则从最远端到V再抵达直径某端点这条路径必然远于原创 2013-05-16 21:43:17 · 1323 阅读 · 0 评论 -
lightoj 1168 tarjan 强联通分量加缩点 加各种题目坑
#include #include #include #include #include using namespace std; vector G[2000]; vector C[2000]; int dfn[2000]; int low[2000]; int cmp[2000]; stack sta; bool instack[2000]; bool used[2000]; int top原创 2013-11-11 12:49:20 · 731 阅读 · 0 评论 -
所以说,你是个会写2分的人么?
关于2分,实在是自己的痛处,上次区域赛热身的时候把2分写挂了,被黑了好几个月了= =,幸亏我有强大的心脏。。 2分的用处不仅仅在于查找,还有很多用处,比如2分答案,查询满足条件的最大值,或者查询满足条件的最小值,又或者是平均值。 我写的2分是这个样子的(取自 线段树和树状数组各过一次POJ2182) 因为我要找的是满足空格数符合条件的最小的一个值,也就是找下界,所以选择更新一个左开右闭的原创 2013-11-06 11:14:27 · 602 阅读 · 0 评论 -
根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数
本来想写一B+树,翻到一个帖子里面去了点击打开链接 看到了里面第六个问题 给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数。 上排的十个数如下: 【0,1,2,3,4,5,6,7,8,9】 举一个例子, 数值: 0,1,2,3,4,5,6,7,8,9 分配: 6,2,1,0,0,0,1,0,0,0原创 2013-05-18 14:00:24 · 897 阅读 · 0 评论 -
单调队列 POJ 2823
引用: 一. 什么是单调(双端)队列 单调队列,顾名思义,就是一个元素单调的队列,那么就能保证队首的元素是最小(最大)的,从而满足动态规划的最优性问题的需求。 单调队列,又名双端队列。双端队列,就是说它不同于一般的队列只能在队首删除、队尾插入,它能够在队首、队尾同时进行删除。 【单调队列的性质】 一般,在动态规划的过程中,单调队列中每个元素一般存储的是原创 2013-11-16 21:21:20 · 532 阅读 · 0 评论 -
tarjian算法 最大强连通分支
先记下思路,使用今后再更新 tarjian算法是利用DFS寻找最大连通分支的算法,算法只需要对图进行一次DFS,无论时间复杂度还是代码复杂度都不是太高。 思路就是先利用DFS构造一棵树,那么分成四种边——树边、前向边、后向边、交叉边。前向边在环中等价于树边 (请画图验证) ,因此直接忽略,交叉边在树中不构成环(依然画个图...),只有后向边构成环(还是画个图),因此,重点就是利用后向边,找到原创 2013-05-16 01:02:15 · 1385 阅读 · 0 评论 -
UVA 674 背包之殇
题目地址 : http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19104 本来以为对于简单的背包已经了解了,可还是在这道题上挂了彩。自己写了两种代码。 第一种是对每类钱,枚举其拿的张数 dp[i][j]=累加dp[i-1][j-k*money] 我觉得8000-的数据,N3 也无所谓的,交上去T了。原创 2013-10-11 02:42:28 · 436 阅读 · 0 评论 -
UVA103 DP记忆化搜索
这个题用了一种方法,两种形式搞的,非递归形式的DP没过,于是按照相同的思路写了个递归形式的记忆化搜索的方法。然后过了。 dp[i][j]代表第i个箱子选择j的时候的最长序列。 这个题目中把箱子当做点把可以包含当做边的话则形成一个DAG,所以可以放心的进行搜索。 AC代码 #include #include #include #include using namespace std;原创 2013-10-09 12:36:44 · 310 阅读 · 0 评论 -
最长上升子序列的O(nlogn)搞法
今天写一个问题的时候遇到最长上升子序列的问题 按照DP的搞法,dp[i]代表以第i个数结尾的最长上升子序列, for(i=0;i<n;i++) { for(j=0;j<i;j++) { if(num[i]>num[j]) dp[i]=(dp[i])>(dp[j]+1)?(dp[i]):(dp[j]+1); } } 这样来做,但是O(n^2)的复杂度是能忍的原创 2013-10-08 21:58:59 · 404 阅读 · 0 评论 -
关于DP的一些新的理解
昨天做TC一道550分的题目的时候因为没计算好复杂度,直接用的递归来做跪了。其实在写的时候就想到,这样做会有很多的重复计算的,要不要把这些结果存起来,但是因为贪恋递归算法的优雅和简短,没有使用那个。因此题目test的时候就出错了。 现在想想,DP其实就是带记忆的递归而已。递归是已经很熟悉了,在写问题的时候可以先使用递归来解决,然后把递归式的中间结果保存下来,就变成动态规划了。原创 2013-09-21 09:31:19 · 567 阅读 · 0 评论 -
新学的next_permutation 算法和KMP
1)next_permutation 这个方法是中的一个函数,变量是需要求的数组的起始位置和终止位置。可以把这段数组变换为按字典序递增的最小的下一个排列。比如abcd变成abdc。 算法过程是这样的 1.从最后开始向前面找第一对相邻的数,下标小的那个大于下标大的那个,记录前面的那个数的大小A 2.从最后面开始向前遍历,找到第一个大于A的数,交换两数位置 3.将原数A所在位置之后的字符原创 2013-09-30 00:10:06 · 462 阅读 · 0 评论 -
POJ 3259
先翻译一下题目吧,这个题读的难度比做的难度大一点.... John有F个农场,这块农场有N块地方,共有M条路径和W个虫洞。通过路径要消耗一定时间,通过虫洞会回到过去,减少一定的时间。同时,路径是双向的,虫洞是单项的。 请判断john是否可以在农场随便转转再回到出发点的时间可以为负(可以回到过去),其实只要判断有没有负环就可以了。 注意题中对f m w的范围限制的描述,可以作答。 这道题我的原创 2013-05-15 11:51:55 · 624 阅读 · 0 评论 -
POJ1753
解题思路:因为在反转棋中点击一个点偶数次和原来一样,点击一个点奇数次等于点击一次 因此,这道题目总的可能空间就是2^16次方种,网上很多种都是DFS或者BFS,我直接暴力搜索了,这样提交也AC了。 收获:C++中位操作真的很有用也很有意思,找到16个数的组合用排列组合来做非常的容易。 另外:自己用于保存初始棋盘的start变量没有初始化,这个问题让我调试了很长时间。 for(i=0;!o原创 2013-05-12 22:56:59 · 467 阅读 · 0 评论 -
POJ2965
解题思路:这道题也是用的暴力枚举,和POJ1753一样,总共65535个状态空间,依次枚举就可以了,重要的是掌握使用按位操作来表示和改变状态的方法。 关键点:num与1异或得!num与0异或得原数 代码如下,跑的很慢,向各位请教好点的方法。 #include #include int pow1[17]; int s,ss; void flip(int x,int y) { int i,j原创 2013-05-13 12:07:50 · 387 阅读 · 0 评论 -
POJ1062
考察点:最短路径 思路:将冒险家作为图中第0个点,女人做为第一个点,剩余物品是其他点。先构造一个总图,然后根据等级来筛选符合标准的子图,在每一个子图中搜索最短路径,得到的最终最短路径即为所求。 提交情况:提交2次,因为根据权限来筛选的合适子图的代码写错了,少了等于号 收获:熟悉了邻接表建立图的方法和BF算法求最短路径。 代码的确很乱,导致了调试很麻烦,也没分函数,直接啪啪啪的敲上去了,最后原创 2013-05-11 13:07:46 · 437 阅读 · 0 评论 -
数独求解算法
这次写的代码又调试了好久,同学们写程序的时候一定要注意那些每次都要进行初始化的变量啊 思路比较简单check可以检测每个点可以填的数值success判断是否成功,如果成功就暂停一下DFS过程 对棋盘进行遍历,找到可能数值数最少的空点,对其每个可能进行DFS(别忘了为了回溯在DFS之后要把棋盘恢复原状) #include using namespace std; int b[9][9];//棋盘原创 2013-05-17 22:50:44 · 716 阅读 · 0 评论 -
状态压缩DP
怎么确定状态 微观状态 一般都是一堆0101010来表示某位置用或者不用 宏观状态 一般都是用数字来表示微观状态用了几个1 还有状态的阶段。 比如,要计算棋盘上放置K个国王令其不能互相攻击的问题 dp[i][j][s] 就表示第i行状态为S时前i-1行放了j个国王原创 2013-11-14 00:38:44 · 527 阅读 · 0 评论