摘要:
题意:给一棵树,当在某个结点上放置士兵时,与该点相邻的边就被看守住了,求最少需多少士兵才能看住树中所有边。分析:先将无根树有根化,然后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][... 阅读全文
摘要:
题意:给出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 阅读全文
摘要:
题意:给出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 # 阅读全文
摘要:
题意:给出包含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 阅读全文
摘要:
题意:先给出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]。(注意区 阅读全文
摘要:
题意:给出2个深搜过程,确定是否是对同一棵树的遍历。深搜过程是用01串来描述的,0代表远离树根,1代表靠近树根。分析:利用最小表示的思想,我们将树的所有结点按一定的规则排个序,然后比较2棵树的结点是否一样即可。排序规则:先按深度排序(离树根的距离),深度相同的按以该结点为根的子树结点数目排序。其实排序的过程就是统一遍历规则的过程,利用上面的规则排序后的结点是一个宽度优先的搜索顺序,且同一层中按后代结点数目小的先遍历。View Code #include <stdio.h>#include <stdlib.h>#include <string.h>#defin 阅读全文
摘要:
题意: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 阅读全文