随笔分类 - 动态规划(DP)
POJ 2778 DNA Sequence (AC自动机+DP+矩阵)
摘要:题意:给定一些串,然后让你构造出一个长度为 m 的串,并且不包含以上串,问你有多少个。 析:很明显,如果 m 小的话 ,直接可以用DP来解决,但是 m 太大了,我们可以认为是在AC自动机图中,根据离散中的矩阵的幂可以表示 从 i 到 j 需要 x 步的有多少条。比如A[1][2]^5 = 10,表示
阅读全文
HDU 4511 小明系列故事——女友的考验 (AC自动机 + DP)
摘要:小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 2024 Accepted Submission(s): 556 Prob
阅读全文
FZU 1977 Pandora adventure (DP)
摘要:题意:给定一个图,X表示不能走,O表示必须要走,*表示可走可不走,问你多少种走的法,使得形成一个回路。 析: 代码如下:
阅读全文
HDU 6065 RXD, tree and sequence (LCA+DP)
摘要:题意:给定上一棵树和一个排列,然后问你把这个排列分成m个连续的部分,每个部分的大小的是两两相邻的LCA的最小深度,问你最小是多少。 析:首先这个肯定是DP,然后每个部分其实就是里面最小的那个LCA的深度。很容易知道某个区间的值肯定是 [li, li+1] .. [ri-1, ri]这些区间之间的一个
阅读全文
HDU 1693 Eat the Trees (插头DP)
摘要:题意:给定一个01矩阵,问你能画出几条回路,使得包含所有的1。 析:一个插头DP,dp[i][j][s] 表示转移到 (i, j) 这个格子,状态为 s 时的方案数,然后逐格递推。对于每个格子要么有0个插头要么有2个。 代码如下:
阅读全文
Gym 101201H Paint (离散化+DP)
摘要:题意:给定 n 个区间,让你选出一些,使得每个选出区间不交叉,并且覆盖区间最大。 析:最容易想到的先是离散化,然后最先想到的就是 O(n^2)的复杂度,dp[i] = max(dp[j] + a[i].r - a[i].l) 区间不相交,这个可以用线段树来维护一个最大值,因为有区间性,但是也可以不用
阅读全文
HDU 5117 Fluorescent (数学+状压DP)
摘要:题意:有 n 个灯,初始状态都是关闭,有m个开关,每个开关都控制若干个。问在m个开关按下与否的2^m的情况中,求每种情况下亮灯数量的立方和。 析:首先,如果直接做的话,时间复杂度无法接受,所以要对其进行小小的变形,设开灯数X,和每个开关的状态的对应关系是X = x1+x2+...+xn,其中 xi
阅读全文
UVa 12093 Protecting Zonk (树形DP)
摘要:题意:给定一个有n个节点的无根树,有两种装置A和B,每种都有无限多个。在某个节点X使用A装置需要C1的花费,并且此时与节点X相连的边都被覆盖。在某个节点X使用B装置需要C2的花费,并且此时与节点X相连的边以及与X相连的点相连的边都被覆盖。求覆盖所有边的最小花费。 析:树形DP,这是一个比较难想的,
阅读全文
HDU 6201 transaction transaction transaction (树形DP)
摘要:题意:给定一棵树,每个点有一个点权,每条边也是,找一条路径,问你 T-S-sum,T表示路径的终点的权值,S表示路径始点的权值,sum表示从S到T的边权和。 析:把这一条路径拆开来看,那么就是必然是从 a 先经过一个公共祖先 i,然后再到达b,所以,dp[i][0] 表示 从 i 结点到子树结点中能
阅读全文
POJ 2152 Fire (树形DP)
摘要:题意:给定一棵树,要建立一些消防站,并且每个结点到最近一个的消防站的距离不能超过limit i,在每个结点建立消防站要花一定的费用cost i,求最少的花费是多少。 析:想了很久,确实是没想出来怎么做,dp[i][j] 表示 i 结点依赖 j 结点的最小花费,然后ans[i] 表示 以 i 为根结点
阅读全文
HDU 5781 ATM Mechine (期望DP)
摘要:题意:你有一些钱数量在 0 ~ n 之间,然后你要取钱,但是如果取的钱数超过你的钱数,会被警告,问警告不超过m次,把钱取走的期望是多少。 析:dp[i][j] 表示钱在 0 ~ i,然后最多 j 次警告,根据二分的思想,j 最大是11,然后每次取 k 元,分为两种情况,一种是钱数不小于k,那么就会被
阅读全文
HDU 5791 Two (DP)
摘要:题意:给定两个串,让你求出,两个串字串,相同的个数。 析:dp[i][j] 表示 第一个第 i 个位置,第二串第 j 个位置,有多少相同的串, 如果 a[i] == b[j] 那么 dp[i][j] = dp[i-1][j-1] + dp[i-1][j] + dp[i][j-1] - dp[i-1]
阅读全文
UVa 11324 The Largest Clique (强连通分量+DP)
摘要:题意:给定一个有向图,求一个最大的结点集,使得任意两个结点,要么 u 能到 v,要么 v 到u。 析:首先,如果是同一个连通分量,那么要么全选,要么全不选,然后我们就可以先把强连通分量先求出来,然后缩成一个点,然后该图就成了一个DAG,然后就可以直接用DP来做了。 代码如下:
阅读全文
HDU 6006 Engineer Assignment (状压DP)
摘要:题意:一共有n个任务,完成某个任务需要会一些领域的人,一共有m个工程师,每个工程师会一些领域,问这些工程师最多完成多少任务。 析:一个简单的状压DP,在比赛,算着时间复杂度过不了,结果才15ms,说一下思路,先预处理每个工程能有哪几种工程师来完成,然后dp[i][s] 表示前 i 个任务,工程师状态
阅读全文
HDU 6007 Mr. Panda and Crystal (背包+spfa)
摘要:题意:你生活在一个魔法大陆上,你有n 魔力, 这个大陆上有m 种魔法水晶,还有n 种合成水晶的方式,每种水晶价格告诉你,并且告诉你哪些水晶你能直接造出来,哪些你必须合成才能造出来,问你n魔力最多能卖多少钱的水晶? 析:首先知道的是,如果每个所消耗的魔法水晶固定,那么这就是一个背包问题,很简单就能搞定
阅读全文
UVa 12099 The Bookcase (DP)
摘要:题意:有 n 本书,每本书有一个高度和宽度,然后让你制作一个3层的书架,可以放下所有的书,并且要高*宽尽量小。 析:先把所有的书按高度进行排序,然后dp[i][j][k] 表示 前 i 本书,第二 层的宽度是 j,第三层的宽度是 k,第二层和第三层的高度最小,首先我们可以先最高的那本书放到第一层,那
阅读全文
HDU 6170 Two strings (DP)
摘要:题意:给定两个字符串,问你是不是匹配,这不是完全的正则表达式,而且题意有点模糊,'.'能匹配任意字符。'*'能匹配前面一个字符重复0-无数多次,如果是 . * 这样的是先匹配 .,再匹配*。 析:dp[i][j] 表示 第一个串匹配到 i 第二串匹配到 j,是不是能。 如果是a[i] == b[j]
阅读全文
HDU 5977 Garden of Eden (树分治+状态压缩)
摘要:题意:给一棵节点数为n,节点种类为k的无根树,问其中有多少种不同的简单路径,可以满足路径上经过所有k种类型的点? 析:对于路径,就是两类,第一种情况,就是跨过根结点,第二种是不跨过根结点,分别讨论就好,由于结点比较大,所以采用分治来进行处理,优先选取重点作为划分的依据。 代码如下:
阅读全文
HDU 3586 Information Disturbing (树形DP+二分)
摘要:题意:给出n个士兵,其中1号为指挥官,关系为树状结构,叶子为先锋,现在要在总花费小于等于m的情况切断所有的先锋与指挥官的联系,问最大的限制最小为多少。 析:很明显是一个树形DP,但是限制怎么求呢,就是通过二分,然后变成一个判定性问题,dp[i] 表示切断 以 i 的子树的最少花费不多少,当然是不超过
阅读全文