OJ
文章平均质量分 73
记忆星空
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
poj1952
又是一道最长上升子序列的变形,让你求最长下降子序列的长度和个数,长度很简单,统计个数关键是不能重复,什么叫做重复呢,就是你找出来的所有情况,不可以存在2种序列完全一模一样,比如3 2 1 3 2 1这个问题答案 3 1,因为第一个 虽然有2个3 2 1出现,但是他们是重复的,只能算是一种。首先一个问题,假如现在不考虑重复,怎么求最长下降子序列的个数。对于这个问题,我首先想起来以前做过的一道关于最短原创 2014-12-29 11:37:36 · 1097 阅读 · 0 评论 -
poj2777
大二时层接触过线段树,知道大概是什么样子,会写最简单的那种,比如区间最值,区间和,但也是局限在一个点更新的情况下,现在接触到了lazy思想,我认为lazy思想才是线段树的精华吧,而且不是那么好理解。首先说下,复杂度的问题,因为一条任意的线段最多被分解为2logn个线段,所以我们查询的复杂度是logn,更新一个点的时候,我们其实也就是做树高的复杂度就好了,所以也是logn,但是如果是多个点一起更原创 2013-10-27 15:04:55 · 966 阅读 · 0 评论 -
九度1499
这题与很久以前做过一个贪心题类似,给你n个任务,每个任务都有起始时间和结束时间,而且每个任务还有一个价值,不可以在同一时间同时做两个任务,也就是说不能一个任务没做完去做下一个任务,说白了就是给你一段区间,然后几个线段让你去放到区间上,区间和区间不能有重叠(边界有交集可以),每个区间有个价值,问你怎么放才能取得最大的价值。我之前做的是价值为1的,或者说是问你最多可以安排多少个任务,这道题每个区间原创 2014-12-13 21:10:04 · 423 阅读 · 0 评论 -
pat1064
对于写递归次数不多的人来说,这个递归可能不是那么好写,代码中creat(x,y)返回的是我让你从编号x到编号y建一棵完全二叉搜索树的父亲节点编号,这个过程是通过计算,假如我有x,x+1,x+2,....y这么多个点建树,那么这棵树的左右子树分别是多少个点,递归建左右子树后,返回这颗树的父亲节点编号,建完树以后就一遍bfs非常简单了。代码如下:#include#include#inclu原创 2013-09-30 22:52:16 · 826 阅读 · 0 评论 -
pat1055
这题也是浙大今年上机题,而我作为练过大半年的acmer,还是在慌乱中没能拿到满分,今天的话,这题我做了40分钟大概,这题其实不难拿满分,只需要一点经验吧。总觉得某些时候我们忽略了一些条件,这题的话是这个年龄的范围,一般的方法是大家都想得到,能拿到21分,关于超时的那些数据,我只想说,查出来的最多有100个人,但是我得找100000个人,可见很多人其实不用找的,而且他是根据年龄是找的,那么有个想法就原创 2013-10-11 20:17:06 · 1027 阅读 · 0 评论 -
九度1502
九度1502这题我觉得我还是比较奇葩的,看到这种最值这种想到的就是动态规划,弄出了dp方程居然过了2组数据,后来发现,这题貌似没有最优子结构性质。后来看到别人是二分做的,二分的是答案,好吧,总觉得二分答案的想法很奇特,是不是没啥想法了就试试二分答案呢,然后宁波理工蔡老师地方拿来final队员的二分写法,果然比市面上流传的2种更好理解点。受教了。说了一大堆,本题的思路就是,二分一个答案,看看是否原创 2013-11-03 18:04:06 · 937 阅读 · 0 评论 -
pat1068
给你n个数和一个给点的m,问你这n个数中能否有某些数的和等于m,如果有,输出字典序最小的那个解。本题算是一个背包吧,假如不要求输出解,完全可以一维的状态,只要注意下后推和前推,一开始确实被这个坑了,用一维的话,输出的方案会有重复使用某个数的情况,后来改成二维,二维就不存在前推后推的区别了,学背包问题,如果不懂一维二维前推后推的区别,那只能说连皮毛也没学到。dp[i][j]表示前i个数中能否原创 2013-10-25 19:18:55 · 1195 阅读 · 0 评论 -
九度1530
最近迷上了这类优化问题,但是这题不是我想出来的,但是我后来想了下,这样的做法确实是对的。从一个字符串中找到一个连续子串,该子串中任何两个字符都不能相同,且该子串的长度是最大的。这个方法是这样的:设一个head和一个tail,然后用一个数组记录每个字符在head和tail之间出现的次数,在head不变的情况下,tail往后移,当tail没有发现head到tail之间出现的字符时,他接着往后,当发原创 2013-10-12 22:03:53 · 655 阅读 · 0 评论 -
LeetCode 3Sum&&3Sum Closest&&4Sum
终于做了决定,开始做LeetCode,上来先做了3题都是关于sum的,这三题我认为都是从同一个问题变过来的,很多人都知道一个经典的问题就是给你一个数组a和一个数字tar,问你这个数组中有没有两个数的和等于这个给定的数字tar,显然要用O(N)的方法,这个问题的答案就是先排序,然后定义两个边界l和r,l一开始等于0,r一开始等于n-1,每次把边界指的两个数相加和给定的数tar比较一下,如果比tar小原创 2015-01-14 10:42:57 · 532 阅读 · 0 评论 -
LeetCode Best Time to Buy and Sell Stock III && Best Time to Buy and Sell Stock IV
LeetCode这个买股票题,个人认为是出的比较好的,一共四个问题,其中3和4都是hard,在我看来,4的难度比3还是难了不少,因为他涉及到了dp的优化这里就稍微再提一下第一问和第二问,第一问已经有了一个dp的思想,答案是max(prices[i]-min(prices[j]))其中,j从0取到i-1,乍一看需要O(n*n)的复杂度,但是通过用一个数保存前i个price中最小的那个price就原创 2015-03-13 10:57:28 · 522 阅读 · 0 评论 -
LeetCode Largest Rectangle in Histogram&&Maximal Rectangle
第一题就是让你在一个直方图里面求一个面积最大的矩阵,觉得O(n*n)的方法应该是非常显然了,枚举一个长方形,分别往前往后找到它的界,也就是第一个比这个长方形高度小的位置,然后两个界之差乘以这个长方形的高度就是结果,然后枚举所有长方形求最大值即可。这样的复杂度应该是过不了的,这题枚举长方形确实已经不能再优化了,但是找界的方法,可以用一个叫单调队列的东西在O(1)的时间找到。我曾经做过这么一道题,原创 2015-04-10 12:33:49 · 547 阅读 · 0 评论 -
LeetCode Longest Valid Parentheses
觉得本题是我见过为数不多的O(N)复杂度的dp,当然思想也比较巧妙,不过这题不是我自己想出来的,由于这个括号匹配问题和卡特兰数有关,所以我的dp方程就是往二维的去想了,但是这题就是超时。dp[i]表示以第i个字符为结尾的最长合法串,首先如果这个字符是左括号,那么有dp[i]=0,否则计算dp[i]可能需要dp[i-1]的值,就是dp[i-1]表示以第i-1个字符为结尾的最长合法串,那么在这原创 2015-01-28 20:02:21 · 449 阅读 · 0 评论 -
LeetCode Palindrome Partitioning I&&Palindrome Partitioning II
一看到这个问题马上有一个类似矩阵连乘dp的思想,dp[i][j]表示第i个字符到第j个字符可以分的最少回文串数,那么有dp[i][j]=min(dp[i][k],dp[k+1][j]),k=[i,j-1],如果i到j不是回文;dp[i][j]=1,i到j是回文。用这样的方法首先要用数据isdc[i][j]来记录i位置到j位置的串是不是回文,计算这样的dp数组需要的时间复杂度是O(n^3),交上去超原创 2015-01-16 19:59:22 · 518 阅读 · 0 评论 -
poj3468
回家2天多,都在搞线段树了,第一是回家效率也不是很高,第二是线段树也不是很容易搞,前面说了poj2777的一道线段树,那题需要lazy,现在觉得,要是不用lazy的线段树好像不是很正规似的。这里突然想到一点,其实有些做法是无法用lazy实现的,像前面那题着色,单单只是覆盖,比如说你在一个区间多次覆盖了不同的颜色,但是你需要查询该区间的左右儿子时,你传递过去的只是最新的那个颜色,这样是比较容易实现的原创 2013-10-27 20:26:32 · 849 阅读 · 0 评论 -
pat1071
字符串的题是我的弱项,因为我觉得我好像对数字感兴趣,其实这只是借口。本题我在11月2号的时候只拿到了17分,已经忘了是怎么写的,早上做了半小时过了,我觉得让你在一串字符串中统计单词的问题需要注意三点:1开始的时候需要注意单词的开始可能不是在这串东西的第0个位置,可能一开始带有几个空格或者其他非法字符,不过这只是可能,具体也要看题。我的处理的方法是到第一个合法字符开始统计2中间可能有多个原创 2014-01-25 11:03:57 · 702 阅读 · 0 评论 -
hdu1069
本题是一个最长上升子序列的变形,题目给你n种长方体,每种都是无数个,然后让你堆出最大的高度,如果长方体A能放在长方体B上面,那么必须满足长方体A的底面长宽分别都是严格小于长方体B的,根据这一点,给定一块长方体,按照不同的放法,可以生成6个长方体,注意不是3块。另外比较重要的一点就是,这个问题dp前必须要排序,假设长方体的长宽高设为x,y,z,因为前面已经扩展出6个长方体,我就把z当做高,把x,y当原创 2014-12-19 00:07:53 · 550 阅读 · 0 评论 -
poj2362
本题很早就看到过,一直拖到现在才做,本题就是一个排序+搜索+剪枝题,题意非常简单,说一下剪枝:1为了早点剪枝,将优先选择边长较长的棒子2棒子长度和是4 的倍数,最长的棒子小于边长,棒子个数要大于等于43符合2的情况下,我搜到3个边长,也意外着可以构成。代码如下:#include#include#include#includeusing namespace std;in原创 2014-01-19 12:15:00 · 782 阅读 · 0 评论 -
九度1536
这题的话其实是为了说明一个算是比较重要的结论把,假如我要找一棵树中距离最远的两个点,我可以这么找,首先任取一点bfs找到离这点最远的那个点,然后从被找到的这个点出发,再一遍bfs找到离刚找的这点最远的点,那么这两点的距离一定是树中距离最大的,但显然不唯一。这 题让你求树的最小高度,假如我们求出了树中最大的距离L,那么如果我们要在最长路径中选择一个点作为根,显然这个根就是选在中点,最小高度是(L+1原创 2013-10-25 20:14:57 · 707 阅读 · 0 评论 -
pat1010
这题测试数据真的非常恶心,1是radix这个东西可能是long long 型,2将某个数转化进制的时候可能会超出long long的范围,这是他会小于0,3是必须采用二分的方法找,因为for一遍会超时,而且二分找满足条件的最小值。4 二分一开始左边界和右边界的选择 5 小于0相当于大于。#include#includelong long f(char c[],long long r)原创 2013-10-25 19:35:40 · 686 阅读 · 0 评论 -
九度1500
题目意思很简单,算是一个最长公共子序列的加强版把,可以这么认为把。如果让你排成单调向上的一排,相信大家都会做,那么如果是山峰那样的,其实我也需要从前往后,从后往前做一下最长上升自序列,然后枚举每一个点作为最高点,取一个最优的即可,n比较大的时候需要nlogn算法,一般是二分,前几天看到也可以用树状数组做。附1500代码如下#include#includeint a[1000001]原创 2013-10-20 12:17:32 · 622 阅读 · 0 评论 -
九度1544
刚学的st算法,顺便看到了lg取下届的数组实现方式,以前没用过lg这东西,这里存下,关于st算法,本质是动态规划,个人dp认为主要注意的是三点,1初始值,2边界,3递推顺序,方程是这样的:最大值 dp[i,j]=max(f[i,j-1],f[i+2^(j-1),j-1]);最小值 dp[i,j]=min(f[i,j-1],f[i+2^(j-1),j-1]);且dp[i,0]其实就等原创 2013-10-12 18:55:42 · 647 阅读 · 0 评论 -
pat1063
这题暴力的话可能有少数几个点是过不了的,考虑到2000次查询,那么而且集合内的数的个数是10000个,基本只能考虑o(n)的比较了,此时最有可能的就是把2个集合排一下序(放到容器里即可),然后2个指针分别从前往后一步步比较,代码如下:#include#include#include#includeusing namespace std;set::iterator i原创 2013-09-30 23:15:13 · 661 阅读 · 0 评论 -
pat1018
个人认为这题在pat里面算是比较难了,主要是有2点,1,可能很多同学理解不了为什么车送出去了还得送回去,现在把问题简化,就给你一串数,a[1],a[2],a[3],,,,a[n],假设为了让这些数都变成一个k,我需要从a[0]拿出一些数,从左往右送,那么我最少需要拿出多少,才能保证后面的n个数都能变成k。2本题自己想了2种方法,第一是自己想出来的,记录所有最短路的路径,然后倒着搜回去,搜到起点做一原创 2013-09-30 23:37:47 · 817 阅读 · 2 评论 -
pat1017
pat里面有好几题都是模拟这种排队的,包括1014还有1030等,个人觉得这样的题目挺不错,可以考验你的模拟能力。就1017来说,要注意一点:17点一定关门,只要是17点前来的都要服务,即使可能超时 ,主要思想是:枚举每一个来的客户,当他们到达时,枚举每个窗口看是不是有窗口可以给他服务,如果有则服务,修改给与服务窗口的下次可服务时间,如果所有窗口都不能给他服务,那么客户就找一个等待时间最小的窗原创 2013-10-01 09:48:37 · 649 阅读 · 0 评论 -
pat1056
这题就是模拟,悲剧的是,复试的时候我真的居然紧张到样例都模不出来,仅靠猜拿到了2分,可能第二次做这个题,今天这题充其量就花了半小时,可惜了,不过就算我这题过了我也只能在软院,因为我够不上计院那根线。。。这题的话就是模拟,没什么好说的,代码如下:#includeint w[1001];int tmp[1001][2];int cl[1001][2];int dep[1001]原创 2013-10-01 11:57:24 · 741 阅读 · 0 评论 -
pat1060
这题的话只能自己题目还是做少了,一直没想到居然还有前面多个0的情况,本题不难,但是想拿满分可能不是很容易,我的做法是把2个数字按是否为0来分的,非0的情况,指数怎么算,我的做法是用小数点的位置减去第一个非0非小数点的位置,但是如果减出来的值,小于0,还得加1,大家可以想下为什么代码如下:#include#includeint main(){ int n; c原创 2013-10-06 11:50:40 · 679 阅读 · 0 评论 -
Pat1034
这题的话其实不是特别难,但是如果没有特别好的方法,很难拿到满分,而且比较麻烦,但是会一点小小的搜索,拿个十几分还是可以的,比较恶心的题目没有告诉你有多少个点,如果map的话,最多就2000个不同的点,因为它只给你1000条边,我第一次看到这题想到的是搜索,搜的一塌糊涂,拿了17分,后来看到王道上的人都是用并查集做的,所以自己也试了下并查集的做法,这题用并查集能较好的解决2个问题:1在并查集选择fa原创 2013-10-11 20:09:29 · 1441 阅读 · 0 评论 -
pat1044
个人觉得这题非常的不错,对这类优化问题,个人非常的喜欢,大公司的面试题,很多也是这类优化问题,一般的方法大家都能想到,而好的方法却只有一部分人能想到。这题其实就是让你在一串数中求连续的一段数,这段数的和减去给定值要尽量小(小到0最好),其实对这题最为有用的一个性质是这样的,假如我找到了一个Ai,A(i+1)......Aj 满足了要求,那么我下一次从i+1开始找的时候,我的j是不需要从i+2开原创 2013-10-11 20:49:00 · 1106 阅读 · 0 评论 -
LeetCode Dungeon Game
起初我是这样定义dp的。dp[i][j]表示从(0,0)到(i,j)需要的最少血量,那么有,dp[i][j]=min(dp[i-1][j],dp[i][j-1])-dungeon[i][j];大家可以想想这个方程对吗?给这么一组数据 -3,2那么我走到-3需要hp=4,那么走到2需要hp反而变少了,变成了2?试问我用hp等于2出发,连-3都过不了!所以这样的方程明显错误。换原创 2015-01-28 21:20:46 · 654 阅读 · 0 评论
分享