
算法刷题
文章平均质量分 82
以ACM-ICPC竞赛为主的算法刷题。
GoldenFingers
持之以恒!!!
展开
-
栈及其DFS:B - Parentheses Balance
解题心得及总结: 1、递推:又1推出n,数列中的基本到通项,最终目标得出通项公式。 递归:又n先压缩栈到1,再从函数的出口找到1,又1到n,再从n计算到1; 2、判断是否可以由递推或递推得出,再判断可以用BFS or DFS得出,BFS使用队列(queue),DFS使用栈(stack)。 3、队列,先进先出。如图:栈先进后出,又称先进后出表。 。原创 2017-01-15 09:34:40 · 780 阅读 · 0 评论 -
DFS初级剪枝及心得
关于DFS心得: 1、利用结构体,记录mark和题目要求的基本属性。 2、用到递归,使用递归时注意要设置出口,即符合要求时return,注意对递归的理解,对于不同情况可能要传递不同的参数,但出口都是一样的。 3、在DFS时可以剪枝,即对明显不符合条件的情况(基本判断,比如正方形的四边一样长,三角形的两边大于第三边)直接排除,不参与递归,在剪枝的时候注意正确的剪枝。所以在DFS超时时可以考虑剪枝原创 2017-01-14 11:21:22 · 1610 阅读 · 0 评论 -
BFS:Nightmare(可返回路径)
解题心得: 1、point:关于可以返回路径的BFS的标记方法,并非是简单的0-1,而是可以用时间比较之后判断是否push。 2、queue创建的地点(初始化问题),在全局中创建queue在一次调用BFS()函数之后并不会初始化,应该在BFS()函数之中创建queue。 3、有关BFS的题可以用不同的函数实现不同的功能(maps_store、check、BFS),在查找bug的时候思路更为清晰原创 2017-02-06 11:36:50 · 709 阅读 · 0 评论 -
BFS例题:A计划
BFS基本运用原创 2017-01-13 15:16:45 · 851 阅读 · 0 评论 -
BFS:胜利大逃亡
解题心得: 1、水题,主要主意好一个点就好。 2、注意x、y、z坐标的选取就好。题目: Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Igna原创 2017-02-21 18:32:52 · 571 阅读 · 0 评论 -
栈经典列题:Rails
解题心得: 1、这题是先进后出的顺序,所以使用栈(先进后出表)。 2、搞清楚题意,需要达成的序列和进入的序。不要弄混了。 3、思维混乱的时候要冷静,冷静,冷静~~~~!题目: Description There is a famous railway station in PopPush City. Country there is incredibly hilly. The statio原创 2017-02-07 11:19:19 · 1244 阅读 · 0 评论 -
String使用方法详解
标准c++中string类函数介绍注意不是CString之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类型转载 2017-02-26 10:55:10 · 1504 阅读 · 0 评论 -
BFS:Open and Lock(一个数的逐位变化问题的搜索)
解体心得: 1、关于定义四维数组的问题,在起初使用时,总是在运行时出错,找了很多方法,最后全部将BFS()部分函数写在主函数中,将四维数组定义在主函数中才解决了问题。运行成功后再次将四维数组定义为全局变量,BFS()函数独立出来没发生运行错误。很纠结,找了三天的BUG! 2、关于一个数的逐位变换,BFS()中有三个主要变换+1循环,-1循环,邻位交换循环。思路清晰,简单。 3、注意step+1原创 2017-02-25 14:31:10 · 560 阅读 · 0 评论 -
DFS:C 小Y的难题(1)
解题心得: 1、在明确使用DFS之后一定要找到递归函数的出口、方向,以及递归的点(在某个情况下开始递归)(void 也可以return,但是没有返回值)。递归时也要有递归的方向,最后都能够达到递归的出口。 2、在DFS递归的出口处可以用一个数组来进行记录最终的结果,双向递归可以用一个二位数组来记录结果。 3、在循环中,尽量不要多次使用一个变量(不然找错找得你哭瞎双眼。伤心。。。。。。)。 4原创 2017-01-14 17:13:46 · 822 阅读 · 0 评论 -
错位排列心得及例题
错位全排列归纳: 1、常见例题:信封装错问题,抽奖问题(可以衍生概率问题)。排列出现完全错误,一个也不对等问题的的个数和出现的概率等。 2、可以转化为数学模型:已知一个长度为n的有序序列{a1,a2,a3,…,an},打乱其顺序,使得每一个元素都不在原位置上,则一共可以产生多少种新的排列? 可以先找出第一个,第二个的特例,从第三个开始递推。 3、错位排列公式:f(n) = (n-原创 2017-01-13 19:16:22 · 2145 阅读 · 0 评论 -
动态规划:最长上升子序列(二分算法 nlogn)
解题心得: 1、在数据量比较大的时候n^2会明显超时,所以可以使用nlogn 的算法,此算法少了双重循环,用的lower_bound(二分法)。 2、lis中的数字并没有意义,仅仅是找到最小点lis[0]和最大点lis[len],其中,在大于lis[len]时len++,在小于lis[len]时可以将arr[i]在lis中的数进行替换掉。所以此算法主要是在不停的找最合适的起点和最合适的终点。原创 2017-03-05 16:13:33 · 9654 阅读 · 15 评论 -
动态规划:HDU-1203-0-1背包问题:I NEED A OFFER!
解题心得:动态规划就是找到状态转移方程式,但是就本题0-1背包问题来说转移方程式很简单,几乎看模板就行了。在本题来说WA了很多次,很郁闷,因为我记录v[i]的时候i是从0开始的,一些特殊数据就很尴尬了,比如 0 3,0 0.1,0 0.1,0 0.1。所以记录i要从1开始。输出double类型的实数时在cb中输出使用%f就行了,但是输入要%lf。题目:原创 2017-04-13 15:30:07 · 922 阅读 · 0 评论 -
水题:HDU-1088-Write a simple HTML Browser(模拟题)
解题心得:1、仔细读题,细心细心。。。。。。2、题的几个要求:超过八十个字符换一行,换行,打印一个分割线,最后打印一个新的空行。主要是输出要求比较多。3、检验的时候可以使用文件读入和文件输出,这样方便判别。题目:Problem DescriptionIf you ever tried to read a html document on a Ma原创 2017-05-04 21:25:16 · 775 阅读 · 0 评论 -
动态规划:HDU-2542-0-1背包问题:饭卡
解题心得:这题就是一个简单的0-1背包问题,只不过加了一系列的限制。可以想办法消去限制,直接转换成0-1背包问题的模板形式。需要注意的几个点:首先对于剩余的5元钱的处理可以直接在总的钱数上将5减去,然后处理大于零就行了(将特殊化为一般)。第二点,需要排一个序,比如有money10元,两种菜5,6,就需要排序之后进行计算。第三点,最后得出的答案应该是大于5的(之前减了5),所以最后的答案减去一个最原创 2017-04-15 11:06:40 · 406 阅读 · 0 评论 -
BFS:HDU-1242-Rescue(带守卫的迷宫问题)(优先队列)
解题心得:1.读清楚题意,本题的题意是有多个‘r’(起点),多个r多个bfs比较最短的时间即可,但是hdoj的数据比较水,直接一个起点就行了,迷宫里有多个守卫,如果在路途中遇到守卫会多花费一个时间点,求最短时间救到公主。2.(解法一)因为遇到守卫会多花费一个时间,所以在守卫的地方再次压入,但是时间加一,这样就可以让队列里面的先验证。3.之前将此题理解为要将所有的守卫打败原创 2017-04-16 11:08:50 · 526 阅读 · 0 评论 -
快速幂学习入门
快速幂学习心得: 1、快速幂大致分为普通的快速幂,快速乘法,矩阵快速幂(point); 2、快速幂主要应用的是二进制,详细的见模板。 3、快速乘法,其实乘法就是多个数相加,当数据很大的时候加起来会非常的慢,这里可以用到快速幂的思想。详细见模板 4、主要的还是矩阵快速幂,矩阵快速幂可以将矩阵看作一个常数,思想不变,可以operater *,主要参考一下线性代数上的矩阵的乘法运算。普通快速幂:原创 2017-04-02 16:23:00 · 2073 阅读 · 1 评论 -
动态规划:HDU1248-钱币兑换问题
解题心得:(青蛙跳台阶:有n阶台阶,青蛙可以一次跳一阶也可以一次跳两阶,问总共有多好中跳法)1、之前把这个问题的思路弄错了,以为是递推,就像青蛙跳台阶,用斐波那契求解。但是用斐波那契肯定会超范围。反过来想自己的思路其实是错的。青蛙跳台阶其实要区分顺序,比如三级台阶,先跳两级再跳一级和先跳两级再跳一级是两种不同的方法,但是钱币问题两分和一分都可以凑成三分钱但是不分先后顺序。2、凑硬币有三原创 2017-05-11 15:58:57 · 2237 阅读 · 0 评论 -
数学算法:求多个数的最小公倍数
解体心得: 1、一开始我的算法是找出最大的那个数,再将那个数一倍一倍的相加,但是会超时,因为题目的限制是32bits。(过于天真) 2、运用小学奥数的算法,多个数的最小公倍数,先将两个数的最小公倍数求出,再与后面的数求最小公倍数。两个数的最小公倍数,可以先将两个数相乘再除两个数的最小公因数。为了避免溢出,可以先相除再相乘。题目:Problem DescriptionThe least comm原创 2017-03-25 10:16:30 · 15218 阅读 · 0 评论 -
动态规划:凑硬币(中级:动态规划思想体会)
解题心得: 1、对于动态规划,并不是简单的套公式,自己的思想是第一位。首先应该自己去想解决问题的方法,用动态规划去理解题,抓住真正的转移点,扩大点,公式会很自然的出来。转移状态的方程式很多变,并不是固定不动的。 2、此题在动态转移的时候使用的是二维数组,所以方程式是多变的,思想也在变动。 3、在结果固定不变的题可以先打表,得出所有的答案,在多次询问的时候直接从表中的到结果,这样可以节省时间。原创 2017-03-12 11:09:51 · 1855 阅读 · 1 评论 -
DFS:Prime Ring Problem(素数环)
解体心得: 1、一个回溯法,可以参考八皇后问题。 2、题目要求按照字典序输出,其实在按照回溯法得到的答案是很正常的字典序。不用去特意排序。 3、输出有个坑,就是在输出一串的最后不能有空格,不然要PE,很尴尬。题目: Problem Description A ring is compose of n circles as shown in diagram. Put natural nu原创 2017-03-21 20:32:58 · 359 阅读 · 0 评论 -
动态规划:分硬币
解题心得: 1、主要是找到状态和状态转移方程,将大的问题缩小,一步步扩大得到最后的最优解。 2、和最长上升子序列相比,此问题不过是单位长度1变成了硬币的分值,所以将大于或小于改为value的几个值 3、可以想推出前面几项来得出最后的状态转移公式。 上面是在网上看到的一篇好文章,里面有一个凑硬币的问题 如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元? (原创 2017-03-11 16:29:03 · 1014 阅读 · 0 评论 -
动态规划:最长上升子序列之基础(经典算法 n^2)
解题心得: 1、注意动态转移方程式,d[j]+1>d[i]>?d[i]=d[j]+1:d[i] 2、动态规划的基本思想:将大的问题化为小的,再逐步扩大得到答案,但是小问题的基本性质要和大的问题相同。 3、这是动态规划的经典方程式,但是耗时较多,在数据较大的时候会出现超时的情况。题目:1180: 最长上升子序列之基础 Time Limit: 1000 MS Memory Limit: 655原创 2017-03-05 14:44:30 · 586 阅读 · 0 评论 -
动态规划:HDU-2955-0-1背包问题:Robberies
解题心得:这题涉及概率问题,所以要运用概率的知识进行解答。题目要求不被抓到的概率,但是给出的是被抓到的概率,所要用1减去后得到答案。最好使用double类型,避免精度问题导致WA。先算出可以抢劫的总钱数,以此动态规划。Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot原创 2017-04-14 17:12:57 · 417 阅读 · 1 评论 -
大数运算:HDU-1042-N!(附N!位数的计算)
解题心得:这里使用了10000进制。很明显,因为是n!所以单个最大的数是10000*10000,使用万进制。可以借鉴高精度的加法,单个乘了之后在进位。很坑的一点,0!=1,数学不好WA了三次,尴尬。10000!有35660位数,求解方法如下 方法一! 可以将n!表示成10的次幂,即n!=10^M(10的M次方)则不小于M的最小整数就是 n!的位数,对该式两边取对数,有 M =lo原创 2017-04-16 09:41:16 · 597 阅读 · 0 评论 -
DFS:Tempter of the Bone (规定时间达到规定地点)
解题心得: 1、注意审题,此题是在规定的时间达到规定的地点,不能早到也不能晚到。并不是最简单的dfs 2、在规定时间达到规定的地点有几个剪枝: 一、所需的步骤 - x相差行 - y相差列 = 偶数。 二、总的格数减去墙数一定大于等于所需的步骤 三、当时间超出了所需的时间时要return,并且消除标记。题目: Tempter of the Bone Time Lim原创 2017-03-18 10:13:19 · 589 阅读 · 0 评论 -
递推:Number Sequence(mod找规律)
解题心得: 1、对于数据很大,很可怕,不可能用常规手段算出最后的值在进行mod的时候,可以思考找规律。 2、找规律时不必用手算(我傻,用手算了好久)。直接先找前100项进行mod打一个表出来,直接看就行了。 3、对于像斐波那契数列(本题)的那样,凭借肉眼无法找到规律的时候,可以观察本题的特点。那就是,第一项和第二项不会变,都为1,1。所以循环的时候必定是以1、1为开始,中间的数可以直接记录,很原创 2017-03-14 09:24:42 · 590 阅读 · 0 评论 -
动态规划:完全背包问题-HDU1114-Piggy-Bank
解题心得:1、这是一个完全背包问题的变形,题目要求是求在规定的重量下求价值最小,所以需要将d[0]=0关键的初始化2、当不可能出现最小的价值时,d的状态并没有被改变,说明并没有放进去一个硬币。题目: Piggy-BankTime Limit: 2000/1000 MS (Java/Others)原创 2017-05-07 10:26:26 · 419 阅读 · 0 评论 -
vector函数用法
vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问元素,还可以使用指针的偏移方式访问,和常规数组不一样的是,vector能够自动存储元素,可以自动增长或缩小存储空间,vector的优点:1. 可以使用下标访问个别的元素2. 迭代器可以按转载 2017-02-26 11:04:09 · 528 阅读 · 0 评论 -
库函数的使用:sscanf的使用方法
(转)sscanf() - 从一个字符串中读进与指定格式相符的数据 函数原型: Int sscanf( string str, string fmt, mixed var1, mixed var2 … ); int scanf( const char *format [,argument]… ); 说明: sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin转载 2017-03-25 10:41:38 · 785 阅读 · 0 评论 -
动态规划:多重背包问题-悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
解题心得:1、将多重背包问题当作0-1背包问题来解决,在费用增加的时候讨论买入的个数就行了,还是依次解决买入的商品总类问题。2、注意一下状态转移方程式的意义,不要弄混淆了,主要多了一个限制物品个数和个数多了之后限制资金不要超出的问题。题目:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活Time Limit: 1000/1000 MS (Java/原创 2017-05-07 14:16:56 · 444 阅读 · 0 评论 -
二分法:CF371C-Hamburgers(二分法+字符串的处理)
HamburgersTime Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u DescriptionPolycarpus loves hamburgers very much. He especially adores the hamburgers he makes with his原创 2017-07-02 19:43:07 · 543 阅读 · 0 评论 -
动态规划:ZOJ1074-最大和子矩阵 DP(最长子序列的升级版)
解题心得:1、是一个很明显的动态规划,但是一开始的思路有点混乱,所以在处理的时候可以参照一下的方法: 在输入的时候就将矩阵中的每一个数改写为前面I个数的和(这样才能处理子矩阵)。 在处理列的时候已经将数字改写了,所以处理子矩阵行的时候只能使用循环得出答案,记录最大的那个子矩阵。2、在做动态规划的题的时候首先要看出这个题原创 2017-06-24 15:19:15 · 850 阅读 · 2 评论 -
二分答案:Poweroj2461-入门基础之二分答案(二分法的应用)
传送门:点击打开链接 入门基础之二分答案Time Limit: 1000 MS Memory Limit: 65536 KBTotal Submit: 179 Accepted: 33 Page View: 744Description M78喜欢积木,更喜...原创 2017-07-02 19:36:25 · 1089 阅读 · 0 评论 -
最短路径(最基础,经典的模板和思想):HDU-2544最短路
迪杰斯特拉算法、弗罗伊德算法原创 2017-06-27 10:49:10 · 418 阅读 · 0 评论 -
模拟:HDU1034-Candy Sharing Game
解题心得:1、直接模拟每一次分一半就行了,模拟过程,记录轮数,但是也看到有些大神使用的是链表,估计链表才是真的做法吧。题目:Candy Sharing GameTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissio原创 2017-05-19 10:30:07 · 321 阅读 · 0 评论 -
DFS:POJ1088-滑雪(记忆化搜索)
解题心得:1、一开始在做这个题的时候是直接找的最高点然后到达最低点的最长路径,然后毫无疑问的wrong了,其实很容易看出可能出现多个相同的最高点。2、其实这个一个题记忆化搜索一下就行了,将每一个点当作起点,记录它到达其他点的最远的路径,如果到达这个点的路径小于已经记录下来的路径直接跳出就行了,为了优化,也可以先找一个最高点然后深搜一下,记录一下到达每个点的路径,如果其他起点小于这个点被记录原创 2017-07-01 19:32:49 · 312 阅读 · 0 评论 -
DFS、栈、双向队列:CF264A- Escape from Stones
解题心得:1、刚开始看到这个题的时候挺蒙蔽的,第一想法就是使用暴力,但是毫无疑问的是暴力肯定会将精度丢失,即使骗数据过了也容易被Hack。其实这个题有很多的解法2、先说思路,题意上面说的很明白,当向左的时候最左方的一个是第一个r的前一个,最左方的r的是第一个r出现的时候,可以画一个图了解一下。3、做法很多,了解了思路之后很简单,直接贴代码:DFS:#includ原创 2017-07-01 19:47:53 · 321 阅读 · 0 评论 -
DFS:BZOJ1085-骑士精神
题目:[+]1085 SCOI2005骑士精神DescriptionInputOutputSample InputSample OutputHINTSource1085: [SCOI2005]骑士精神Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1461 Solved: 796[Submit][Stat原创 2017-07-04 09:59:26 · 388 阅读 · 0 评论 -
动态规划:HDU-1398-Square Coins(母函数模板)
解题心得:1、其实此题有两种做法,动态规划,母函数。个人更喜欢使用动态规划来做,也可以直接套母函数的模板Square CoinsTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12191 Accepted Su原创 2017-05-13 10:49:03 · 424 阅读 · 0 评论 -
数学算法:poweroj1026-丑数(根据固定倍数得到从小到大的序列)
解题心得:1、一开始想的是用一个数多次除尽2、3、5、7,最后能够得到1则是丑数,后来想了想,只要用1不停的乘上2、3、5、7就可以得到丑数,但是题目是对于第几个丑数的提问,所以我们需要对于得到的丑数进行一个排序,去重。但是由于数据量比较大,这样明显是不行的。所以需要在去重、排序的部分进行优化。2、怎么优化呢,这里有一个很神奇的操作,就是把已经排好序的一个丑数列(这里直接用的1),(用1)原创 2017-06-25 09:43:49 · 1036 阅读 · 1 评论