poj题目

poj2965 poj1753:标准的BFS+位运算优化

poj1328:线段覆盖变种,把圆对应到线段上,贪心求解

poj2109:高精度开根,二分+高精度,注意要判断答案的位数,如果按照题目给的范围二分会TLE

poj2586:给十二个月定盈亏(每个月+s或-d),连续5个月总的需要时亏,求12个月的总的最大盈利。枚举或者贪心,贪心的话就尽量把亏损的放在连续五个月的后面,这样使得-d尽可能少

poj3295:枚举所有bool变量的取值,然后带入算

poj3259:裸的spfa判断负还

poj1062:最短路变种。在最短路的前提下定义每个点的等级,等级差>M的两个点无法在一条路径上,求最短路。刚开始考虑把不符合的构造成一个负环,后来发现这样仍然会造成路径上不可能存在的边更新,正确做法是枚举最小等级,把所有等级符合的点和边加进去成为新图,求最短路

poj1860:

poj2253:MST问题。求S到T点的所有路径中的最大值的最小值。典型的求最小生成树的最大边

poj3041:二分图最小点覆盖=最大匹配,匈牙利算法

poj3020:无向图的最小边覆盖。拆点成二分图,ans=|P|-最大匹配/2

Poj3080:求多个字符串的最长公共子串。经典的后缀数组应用

poj3274:题意是要找到满足s[r][0..k-1]与s[l][0..k-1]对应位置差相等的最大的r-l,将问题转化成s[r][i]-s[r][i-1]==s[l][i]-s[l][i-1]这种,然后就能单独处理一个位置的数组信息,问题即要求两个相同数组的最远间距,这个用hash就可以了

poj2151:有T个人参加比赛,共有M道题,第 i 个人通过第 j 题的概率为 p[i][j] 求:所有人都至少做出一道题,而且第一名至少做出N道,求这个结果的概率。f[i][j][k]表示第i个人,前j道题,做出k道的概率,很方便可以递推出。ans=所有人至少做一道题概率-所有人至少做出题但是都小于N道的概率,前面这个直接减,后面这个循环枚举做出几道相减

poj1840:求给定五元三次方程在给定定义域上的解的个数,直接枚举TLE,可以先枚举左边三个,将其值放在HASH表中,再枚举右边两个,和hash表中的配对

poj2020:

poj2513:Trie,然后判断是否为欧拉路,统计每个点度数、并查集判连通(目前仍然RE)

poj3083:每层搜索搜索顺序不同的DFS,搜的过程中保留记录当前方向,并根据当前方向决定不同的搜索顺序

poj1837:固定天平钩子的位置和勾码的数目和重量,求天平平衡的方案数。f[i][j]表示前i个砝码,力臂和为j的方案数,ans=f[n][0],转移的时候平移一下,这里将钩子的位置视为每个物品的数量 

poj1276:

poj3267:区间DP,单词的开头和结尾把S分为连续的若干段区间,所以可以区间DP,注意考虑一段区间全删除的情况(初始值)

poj1159:给你一个字符串,至少加多少字符让其变成回文串。加一个字符等价于删除它对应的字符,所以问题转化成最少删掉多少字符使其变成回文串,也就是在原串中找到最长的可以跳跃的回文串,于是就想到把原串翻转过来,两个串做一个LCS

poj3252:

poj1019:f[i]表示第i组数的尾部在第f[i]个位置,从而对于一个询问就能找到对应的组,在哪个组中继续寻找就行了

poj1942:就是求C(n,m)的问题……然而这题n,m很大,但是没mod,保证结果不需要高精度。n,m达到了2^32,筛选出素数把每项因式分解也办不到……然后看了题解,竟然把当做double类型一项一项除,最后强行转成longlong类型……

poj2635:高精度数取单精度模问题,将高精度数几位压成一位加速除法过程,我是压了9位

poj2115:

poj1905:二分角度判定是否符合题意,注意double类型输出的时候一定要用.f!不能用.lf!

poj1286:Polya定理,这题注意一点就是循环置换的循环个数的计算。

      比如求置换:(  1 ,  2,   3,........... n)

            (i+1,i+2,......1 , n.... i)

     有多少个循环。

     假设从位置x开始,那么依次是x,x+i,x+2*i,...x+t*i,x

       即(x+t*i)%n=x,即t*i%n=0

              所以t=lcm(i,n)/i,循环节长度为t,那么循环个数就是n/t=gcd(n,i)

       此题注意要讨论下奇偶性  

poj3270 置换群,:http://www.cnblogs.com/wmrv587/p/3530506.html

poj3007:主要是字符串判重,用trie判重,用set或者map会TLE

poj1201:差分约束问题,注意这里线段是闭区间,所以对于[ai,bi]要将其表示为[ai,bi+1)

poj2983:

poj2942:对于一个不好处理的图,先求其反图,然后问题就是在这反图里找奇环,环肯定是在点双联通分量里,所以先求出所有的点双。然后如果一个点双里面有奇环,那么这个点双里面所有点都可以找到一个奇环经过它,所以如果找到了奇环那么这个点双所有点就都是好点。问题怎么找奇环呢?很明显就是二分图染色问题,如果能染出二分图那就肯定没有奇环,否则就有奇环

poj3352:很明显先将所有边双联通缩点成一个树,问题就变成了一个树最多连多少边能使它成为一个边双。结论是(叶子节点个数+1)/2,可以构造出来

poj3308:求二分图的最小点权覆盖,行在左边,列在右边,S连向每一个行,容量为价值的log,每一个列连向T,容量为价值的log,行和列中间按照入侵者位置连边,容量为无穷,那么问题就变成了最小割了,所以跑个最大流就行了

poj2828:乍一看看不出是线段树。考虑逆向加入,那么每个数字的p表示的就是前面的空位个数,可以用线段树来维护一段区间的空位个数,插入的时候就类似平衡树比较左边剩余位置的个数和目前位置的大小,进左子树或者右子树

poj2886:和2828很类似,都是通过线段树来维护空位置的数,这题主要是涉及到反素数,对于反素数可以先搜索打表来求

poj2750:点更新的维护区间最大连续和的线段树,只不过这里的线段树是首位相接的环。考虑一段循环区间的最大和,把拉成直线,那么这个区间和要么在中间,要么就是两边各自一段(sum-最小非空子序列和),所以要维护一个最大和、最小和,所以维护的就多了
poj2482:

poj3368:很巧妙的做法,对这个树求dfs序重编号,那么求子树和的问题就变成求一段区间的和,问题就是单点修改区间求和,很简单的BIT

poj2492:并查集扩展,每个点记录下与根节点是否同性,sex=0表示同性,sex=1表示异性。注意因为多组数据,所以要先全部读完再判断,即使中途发现有同性,也不能直接break

poj2406:问题是给定一个字符串,找出最小的循环节长度,如aabaabaabaab的最小循环节长度就是3(aab)。可以利用next数组,设next[n]=x,这说明1~x和n-x+1~n完全相同,如果错开的n-x|x,那么发现1~n-x和n-x+1~(n-x)*2相等,以此类推,就说明该字符串有循环节了

poj3411:n个点m条单向边(n,m<=10),每条边需要付钱,有两种付钱方式,一种是付pi的钱,但是要求之前必须经过点ci;另一种是付Ri的钱,没有限制要求。问从1走到n的最小花费是多少。很容易想到状态压缩,f(s,i)表示状态s,最后在点i上的最小花费,但是因为可以走环,所以发现转移会有后效性;换个角度考虑,对于(s,i),能转移到哪些状态以及花费都是已经确定的了,所以可以把(s,i)看作一个点,那么问题就是从(1,1)->(s,n)的最短路,跑spfa就行了,松弛的时候判断负环是否存在

poj1724:每条边有长度、花费,求1->n的最短路,并且要求这条路所有边的花费和<=K。(n<=100,m<=10000,K<=10000)。容易想到d[i][j]表示到了i点花费j的最短路长度,把这个作为状态跑spfa,但会TLE。考虑类似dijkstra+priority_queue的bfs,从第一个点开始bfs,每次选取当前路径中最短的那条继续扩展,cost作为限制条件判断,直到第一次到达n点,那么最短路长度就出来了。

poj3373:注意dp的顺序,应该从最低位向最高位dp,我写最高位向最低位dp的……记录最小解的过程无比痛苦而且最后还错了……,从低到高位dp,只需要0~9枚举数字就可以保证最小解了……

poj1054:枚举点i,j,问题是如何快速判断直线ij上所有格点都在破坏点中。从找bug的角度思考,假设点i在点j的左方(或正下方),那么我们可以将i当作中点,找到j的对称点k,k也必然是个格点,如果k在方格内且k不是破坏点,那么(i,j)就可以×了;如果k在方格内且k是破坏点呢?有点可以转移的感觉,(k,i)+1->(k,j)。那么中间的点漏掉怎么办呢?所以先对所有点升序排序,f[i][j]表示点i、点j表示直线在方格内的整点个数(路径长度),根据上面说的中点技巧,可以从左下角开始向右上dp。时间复杂度O(n^2*hash)

poj1925:

poj2411:最典型的轮廓线dp,用二进制描述轮廓线,注意用longlong

poj1185:先暴力跑出每一行最多只有73个状态,状压dp的话,肯定要保留前2行,枚举第三行,所以时间是O(73^3*100*check时间),check时间很好办,如果合法,那么三行状态的&和必须都是0,所以check时间和转移时间都是O(1),利用位运算可以卡过时间

posted @ 2016-10-12 09:19  Chellyutaha  阅读(375)  评论(0编辑  收藏  举报