上一页 1 2 3 4 5 6 7 8 ··· 23 下一页
摘要: 题意:给一棵树,当在某个结点上放置士兵时,与该点相邻的边就被看守住了,求最少需多少士兵才能看住树中所有边。分析:先将无根树有根化,然后DP。状态设计: 1、dp[i][0],表示在结点 i 没放置士兵的情况下,看住以结点 i 为根的子树的所有边所需的最少士兵; 2、dp[i][1],表示在结点 i 放置士兵的情况下,看住以结点 i 为根的子树的所有边所需的最少士兵。状态转移: 1、dp[i][0]=∑dp[j][1],j 是 i 的儿子结点;(根结点不放士兵时,与其相连的边必须由儿子结点来看守) 2、dp[i][1]=1+∑ ( MIN ( dp[j][... 阅读全文
posted @ 2012-08-08 23:06 BeatLJ 阅读(303) 评论(2) 推荐(0) 编辑
摘要: 题意:给出N个词根,求长不超过L的且至少包含一个上述词根的单词的个数。数据范围:0<N<6,0<L<2^31这题与上一题差不多,但比上题要繁琐的多,关键的区别在于"不超过L" 和"至少包含一个"因为"至少包含一个",所以刚好是求上一题的反面;因为"不超过L",所以要求的是矩阵幂和S = A + A2 + A3 + … + AkView Code #include <stdio.h>#include <string.h>#include <queue>#in 阅读全文
posted @ 2012-08-08 20:25 BeatLJ 阅读(299) 评论(0) 推荐(0) 编辑
摘要: 题意:给出m个致病DNA片段,求长为n且不含致病片段的DNA序列共有多少种。数据范围:0 <= m <= 10,1 <= n <=2000000000这题初看起来与上一题差不多,但一看数据范围就傻了……分析:先建m个致病DNA片段的自动机,然后求出自动机中结点之间转移的路径数目,这样就可以得到一个有向图,所求问题就变为从根结点出发,到达任意一点,所走路径长度为n且路径不经过危险结点的路径数目。再抽象一下,就是求一个边长均为1的有向图中2点之间长为n的路径数目,这就不难想到矩阵了。设G为邻接矩阵,则Gk中第i行j列的元素表示从i到j长为k的路径数目。View Code # 阅读全文
posted @ 2012-08-08 20:16 BeatLJ 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 题意:给出包含n个可见字符的字符集,以下所提字符串均由该字符集中的字符构成。给出p个长度不超过10的字符串,求长为m且不包含上述p个字符串的字符串有多少个。数据范围:1<=n,m<=50,0<=p<=10状态设计:dp[i][j],i 步之内未经过危险结点且第 i 步到达结点 j 的路径数目。状态转移:dp[i][j]=∑dp[i-1][k],在结点 k 加输入 s[i] 能跳到结点 j初始化:dp[0][0]=1,对于其余的 i :dp[0][i]=0注意:由于最后结果很大,而题中又没提到取模,所以要用到大数相加。View Code #include <stdi 阅读全文
posted @ 2012-08-08 19:57 BeatLJ 阅读(993) 评论(0) 推荐(0) 编辑
摘要: 题意:先给出m个DNA片段(含致病基因),然后给一个长为n的DNA序列,求最少需要修改多少次,使得这个DNA序列不含致病基因。修改操作定义为将DNA中某个碱基变为另一个碱基,如将A变为G数据范围:1<=m<=50,1<=n<=1000分析:先建自动机,然后DP。状态设计:dp[i][j]为从根结点出发走 i 步后到达状态 j 最少需要修改的次数。状态转移:1、dp[i][j]=MIN(dp[i-1][k]),从状态k能根据s[i]跳到状态j,无需修改;2、dp[i][j]=MIN(dp[i-1][k])+1,从状态k不能根据s[i]跳到状态j,需要修改s[i]。(注意区 阅读全文
posted @ 2012-08-08 19:30 BeatLJ 阅读(317) 评论(0) 推荐(0) 编辑
摘要: 题意:给出2个深搜过程,确定是否是对同一棵树的遍历。深搜过程是用01串来描述的,0代表远离树根,1代表靠近树根。分析:利用最小表示的思想,我们将树的所有结点按一定的规则排个序,然后比较2棵树的结点是否一样即可。排序规则:先按深度排序(离树根的距离),深度相同的按以该结点为根的子树结点数目排序。其实排序的过程就是统一遍历规则的过程,利用上面的规则排序后的结点是一个宽度优先的搜索顺序,且同一层中按后代结点数目小的先遍历。View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#defin 阅读全文
posted @ 2012-08-08 19:13 BeatLJ 阅读(571) 评论(1) 推荐(0) 编辑
摘要: 题意:Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.分析:与矩阵快速幂的思想一样,都是二分。1、k为偶数,设k=2*m,则S = A + A2 + A3 + … + Am+(A + A2 + A3 + … + Am)*Am2、k为奇数,设k=2*m+1,则S = A + A2 + A3 + … + Am+(A + A2 + A3 + … + Am)*Am+Ak由上可见,原问题均可递归成与原问题结构相同的子问题,递归边界为k=1时,结果为AView Code 阅读全文
posted @ 2012-08-08 18:57 BeatLJ 阅读(296) 评论(0) 推荐(0) 编辑
摘要: 题意:给n个矩形,每个矩形都有一个矩形的“洞”,矩形和洞的边都与坐标轴平行,求这些带“洞”的矩形覆盖的面积。数据范围:n<=50000, 0<=x,y<=50000分析:这题本质还是求矩形面积并,因为一个带“洞”的矩形可以看成是4个矩形。由于矩形数目n和坐标范围均比较大,所以离散化+暴力统计的方法肯定会超时。扫描线的方法我也是第一次学,我的理解是这样的,把所有矩形的2条竖直边(横边也一样)无限延伸就得到扫描线,这些线把所有矩形重新划分为许多不相交的矩形,所有矩形的面积并其实就是夹在这些线之间的矩形的面积之和,夹缝中的矩形的宽就是扫描线之间的距离,关键在于夹缝中矩形的高度是多少 阅读全文
posted @ 2012-08-05 20:07 BeatLJ 阅读(836) 评论(0) 推荐(0) 编辑
摘要: 题意:在二维平面上给出n个矩形的顶点坐标(浮点数),每个矩形的边都平行坐标轴,求矩形覆盖的面积。数据范围:n<=100, 0=<x,y<=100000分析:由于n比较小,所以用离散化就能过(离散化的具体分析见上一篇)。View Code #include <stdio.h>#include <string.h>#include <stdlib.h>#define N 110int n;double xl[N],yl[N];double xr[N],yu[N];double x[2*N],y[2*N];int xcnt,ycnt;bool f 阅读全文
posted @ 2012-08-05 14:47 BeatLJ 阅读(373) 评论(0) 推荐(0) 编辑
摘要: 题意:在二维平面上给出n个矩形的坐标,矩形的边与x轴和y轴平行,求这n个矩形覆盖的面积。数据范围:n<=1000, x,y均为不大于50000的正整数分析:由于坐标都是整数的,我们可以把二维平面看成由面积都是1的小方格组成,最暴力的方法就是标记每个矩形覆盖的小方格,最后再统计一共有多少小方格被覆盖,但是坐标平面太大了,最坏情况下为50000*50000,肯定超时了。虽然坐标范围比较大,但是矩形个数却比较小,此时不难想到离散化,离散化后,我们不再将坐标平面划分为面积为1的小方格,而是根据在n个矩形中出现过的坐标来划分,这样的话,最后划分出来出来的方格数目不会超过2n*2n,这样就不会超时了 阅读全文
posted @ 2012-08-05 13:23 BeatLJ 阅读(350) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 ··· 23 下一页