![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 70
u010152669
这个作者很懒,什么都没留下…
展开
-
炸弹 树形地图
题目大意:在一个50*50的地图内,有些是空地,另外的是障碍物,空地是连成一棵树。若在某空地放置一个炸弹,那么在同一列和同一行且没有障碍物阻拦的格子都被炸到(类似于泡泡堂。。。)。询问至少需要多少个炸弹才能把所有的格子都炸到。 题目中很关键的一个字眼就所有的空地是一棵树,这促使我们往树形动态规划的方面去想。 构建一棵二叉树,左子树表示在同一行的空地,右子树表示同一列的空地。那么,若把某个节点炸原创 2013-05-15 21:54:19 · 807 阅读 · 0 评论 -
coderforces 335B--Palindrome [字符串好题]
给出一个字符串s(长度小于50000),从中找出一个长度不超过100但尽可能长的回文子串(这里的子串不一定要连续的),任意输出一个即可。codeforces的题目都有标签,这题不例外有个DP,便一开始就往这方面想。首先回文一定要左右“对称”,那么如果做动态规划,那么必须左右同时进行。一开始想记f(i,j)为i到j这个区间的最长回文串,但就是空间就已经超了。看到题目中找的最长只是100,能不能记其他原创 2014-04-06 13:05:08 · 733 阅读 · 0 评论 -
ioi 2005--河流 [左儿子右兄弟]
有一棵树(结点数≤100),在根有一个伐木场,每个结点都有若干木头,每条边都有个距离,所有的木头都要往上运,运过一条边的代价为木头数量乘以边的长度。现在可以在某些结点新建k(≤100)个伐木场,建立伐木场后,木头就不一定要运到根了,可以直接运到新的伐木场。问在合理建设伐木场下,最小的代价是多少。这很容易想到树形的动态规划,设f(i, j)为这以i为根的子树新建j个伐木场的最小代价。可是如何转移呢?原创 2014-04-06 13:04:31 · 1182 阅读 · 0 评论 -
GDKOI 2012--mmm含树
这是今年GDKOI的一题:有一棵树,开始时所有结点的值都是0。有多个操作,每个操作有两种:1.对某个点增加w,设dis(i,j)为点i到点j的最短距离,那么某个结点增加w时,对于任意一个结点j,它的值会增加w + dis(i,j)。2.询问某点的值。w可以忽略,因为整棵树都要加上w,只要记下所有w的和就可以了,输出答案时再加上。这题的突破口就是只需要求一个点的值,这就取决于其他发生变化的点对该点的原创 2014-04-06 13:04:19 · 631 阅读 · 0 评论 -
poj 1738--石子合并 [GarsiaWachs算法]
石子合并算是一道比较经典的题目了,这里讨论一下朴素的动态规划和GarsiaWachs算法。最简单的就区间动态规划了。设f(i, j)(i (需要枚举一个p)以区间长度为阶段,时间复杂度为三次方的。一个对决策的优化,可以把转移优化为O(1)的。设g(i, j)为f(i, j)枚举的决策最优的p,那么显然有:这样子枚举的p的范围就大大缩小了,p的取值范围是比较小的,只有一两个左右。然而,该算法的时间和原创 2014-04-06 13:05:01 · 1284 阅读 · 0 评论 -
摩天楼 DP优化
有N(≤1300)栋摩天楼,从左往右排成一行。第i栋的高度是i个单位,并且每栋摩天楼都有颜色(有些摩天楼的颜色相同),将这些摩天楼排列,有多少种排列的方法,使得从左往右看去,看到不多不少刚好L栋摩天楼,答案mod 1000000009。 这里定义一下“看到”,首先若某栋摩天楼左边有比它高的,那就看不到。如果从左往右依次连续看到的两栋(或以上)摩天楼颜色相同,会误认为是一栋。 由于这个关系到次序原创 2013-07-17 15:45:27 · 996 阅读 · 1 评论 -
DP的另一个角度 数列划分
有个长度小于40000数列,把它分成若干段,使得各段花费总和最小。一段的花费为该段不同元素的个数(不妨设有x)个,那么花费为x的平方。 看到题目,不难想到动态规划的做法。设f(i)为前i个元素最小的花费,然后枚举最后一段放多少个元素,不妨设为k个,那么f(i)=min{f(i-k-1)+cost}。这当然是可行的,但时间复杂度不容乐观。 再思考,发现每一段最多只有200个不同的元素,若大于20原创 2013-07-23 14:53:21 · 727 阅读 · 0 评论 -
动态规划和字符串匹配(KMP、AC自动机)
最近学了关于字符串匹配主要的两种方法,做了一些题目,发现这可以动态规划结合,题目中往往有“……T是S的子串……”这类字眼,而且答案要求“最少、最多、多少种”一类的问题。 解决这类问题往往是要记录一个“匹配到哪一位”的状态,然后考虑当前状态可以更新哪些新的状态,下面列举两道题目: KMP 有两个字符串S和T(1 ≤ |S| ≤10000, 1 ≤ |T| ≤ 1000),问题是至原创 2013-04-17 19:12:01 · 1048 阅读 · 0 评论 -
矩阵中的DP题 放象棋
题目的意思很简单:在n * m的矩阵中放置若干个炮(可以不放),使得没有一个炮可以攻击另外一个炮。炮的攻击方式就不用多说了。答案mod 9999973。 这个题目一开始我想得很接近了,但没想到用DP,觉得是组合数学。首先可以把问题转化一下:没有一列或一行有两个以上的炮,这样炮于炮之间就不能攻击了。也就是说,每行或每列,要么不放炮,要么放一个或两个,有三种可能。又因为行列是交错的,每放一个炮,对行原创 2013-07-18 07:57:18 · 653 阅读 · 0 评论 -
土地购买 [DP斜率优化]
经典的题目,土地购买:Farmer John需要买下n(≤50000)块长方形的土地,每块的花费就是长宽之积(就是面积)。他可以一次买多块土地,价格是它们最大的长乘以它们最大的宽, 但是土地的长宽不能交换。问Farmer John在合理分组购买土地下,最少需要的花费。首先,如果一块土地被另一土地包含(比如5*10的土地包含4*6的土地),那么这块土地就不用考虑了,从数据中去掉。然后按土地的宽度排序原创 2014-04-06 13:04:47 · 1003 阅读 · 0 评论