动态规划
文章平均质量分 77
沉溺
这个作者很懒,什么都没留下…
展开
-
hdu 1423 Greatest Common Increasing Subsequence(最长公共上升子序列、LCIS)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1423题目大意:给你两个序列,让你求他们的LCIS原创 2014-04-05 18:56:04 · 686 阅读 · 0 评论 -
UVALive 4290 Easy Climb(dp + 精简状态 + 优先队列)
题目大意:给你n个数字,让你通过 +1、-1 将这些点的数值改变,使他们相邻的点之间的差 思路:如果不考虑数字范围,那么dp方程是很明显的,d[ i ][ j ] = min(d[i - 1][ k ]) ,j - h <= k < j+h,d[ i ][ j ] 表示前 i 个最后第i个数字为 j 的最小操作数。然后它 高度 和 d 的范围是 10^9,这里的处理才是这道题目的难点。但其实,原创 2013-10-03 16:48:06 · 872 阅读 · 0 评论 -
UVALive 3710 Interconnect(记忆化搜索 + hash)
题目大意:一个地方有n个城市,先开始有m条边,每个边连接连个不同的城市,双向边,可以有重边,现在要建边,每年加一条边,建每条边的概率都是一样的,问你能让这n个城市都连通的数学期望是多少?思路:能相互连接起来的点把他们搞成一个个集合,然后根据先开始的m条边就有几个集合了,然后加边,那么这条边就有两种情况,一种是加了某两个集合之间的一条,一个是连接某个集合里的两个点,即没有用的。假设我们设加了某一原创 2013-10-02 16:06:36 · 757 阅读 · 0 评论 -
UVALive 3679 Pitcher Rotation
题目大意:有n个人,m个敌人,g个比赛,持续g+10天,对于每个对手,每个人都有一定的分数,给你一张m*n的表,给出这些每个对手派每个人去的分数,一个人打过了,那么必须要休息4天,然后给你g+10天的每天要打的对手,0表示该天没有对手,问你最大的分数。思路:由于一个人打完后要休息4天,求最大值,那么也就是说,对于第 i 天,选的人一定是前5个之一,而我们只需要记录第 i 天的前4天分别用的是谁原创 2013-09-16 22:00:24 · 746 阅读 · 0 评论 -
UVALive 3132 Minimax Triangulation
题目大意:给你n个点围城的多边形,顺时针或者逆时针给你,起始点任意,让你把他划成n-2个三角形,这些划法中最大的三角形的面积最小,输出这个最小值。思路:按照区间长度进行DP。对于 i~j 这些点,考虑新加入的点是j,那么就多了两条弦 i~j,j-1 ~j,对于 i~j 这条弦,加进去,它能围成的是 tran(i,k,j),i<k<j,,此时最大的三角形是 max( tran( i , k ,原创 2013-10-01 16:02:48 · 1047 阅读 · 0 评论 -
UVALive 5717 Peach Blossom Spring(斯坦纳树 STNT)
题目大意:给你n个点,m条边,问你建立至少包含前k个点和后k个点的最小生成树,也可能是森林,每棵树的前面点的个数要和后面点的个数相等。思路:STNT。如果大家对斯坦纳树不是很了解的,可以参看这里:http://endlesscount.blog.163.com/blog/static/821197872012525113427573/这道题目还有点不一样,那就是它可能最后搞出来是森林,所以原创 2013-09-09 19:12:06 · 1318 阅读 · 0 评论 -
hdu 4739 Zhuge Liang's Mines(状压DP)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4739题目大意:二维平面给你n个点,4个能组成一个正方形的点能一起消除,问你最多能消除几个?思路:因为只有20个点,就状压一下,然后就是 d[ s|s1 ] |= d[ s1 ],这里s1是某4个能组成正方形的点且不包含在s里面,读入的时候处理一下s1就可以了。可以直接dfs过去,找到最长路径就好了原创 2013-09-15 22:49:33 · 641 阅读 · 0 评论 -
UVALive 3181 Fixing the Great Wall
题目大意:现在长城上有n个点要修,每个点有三个属性,x、c、d,x表示位置,其他两个表示如果在 t 时刻修它,那么费用就是 c + t*d,修理点不占时间。有一个人要去修这些点,现在告诉你n、它的速度v、起始位置s,问你总的最小费用。思路:这道题的关键地方有两个:(1)由于修理不占时间,那么时间全花在走路上,对于某一个区间,最小费用情况下,他修理完这些点的最终的位置肯定是两个端点其中之一。(2原创 2013-09-30 14:51:12 · 1815 阅读 · 0 评论 -
Wc2008 游览计划(STNT + 输出路径)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2595题目大意:给你n*m的矩阵,每个格子上的数字表示该地的权值,权值为0,表示该点为关键点,现在让你求至少包含这些关键点的STNT,然后一种可行方案。思路:STNT,就是加了输出路径。这里还要注意,由于我们是把权值放在节点上,所以枚举子树做DP时,还要减掉一个 该点的权值,即 d[原创 2013-09-10 16:23:24 · 1487 阅读 · 0 评论 -
zoj 3613 Wormhole Transport (STNT + DP)
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3613题目大意:n个星球,有几个是有资源的,有几个有工厂,一个工厂需要一个资源星球来维持,有工厂的星球最多4个,有资源的星球最多4个,一个星球可能有几个工厂,但最多只有1个资源。给你m条边,问你在正常工作的工厂数最多的情况下,建的边的总长度最小。思路:STNT原创 2013-09-13 12:26:45 · 953 阅读 · 1 评论 -
UVALive 3305Tour(双调DP)
题目大意:一个平面,有n个点,每个点的x坐标都是不一样的,输入时按照点的x坐标从小到大输入,有一个人从1号点出发,从左往右走,到达最右边的点,然后又从最右边的点回到1号点,问你这段路程的最小总路程是多少?思路:双调DP。设d[ i ][ j ] 表示从点 i 到 1 再从 1 到 j 的最小距离,且规定,i > j ,由于前面那个规定,那么点 i 必须上面去走,求 d[ i ][ j ] 时原创 2013-09-05 21:52:03 · 831 阅读 · 0 评论 -
UVALive 4050 Hanoi Towers
题目大意:3个桩的汉诺塔,每个数据给你一个n,表示盘子的个数,所有盘子起先都是在 A 上,给你一个列表,6个成对的字母,比如 AB 是表示把 A 顶上的盘子移动到 B 上,它整个流程是这样的:从头开始走那个表,找到第一个合法的移动(就是普通汉诺塔的规则一样,再加上后面的那个条件),然后就退出,又从头开始走第二遍表。这里还有另外一个条件,就是同一个盘子不能被连续的移动两次(in a row 原来是连原创 2013-09-03 15:40:47 · 944 阅读 · 0 评论 -
UVALive 3412 Pesky Heroes
题目大意:反正是没怎么看懂,可以看一下这位大牛的博客 http://hi.baidu.com/_lt_zyc/item/bcfb7af5f9280801d6ff8cd7,说实话,看了之后,也不是很懂。。。思路:这位大牛里的博客里也说了,可我还不是很理解,题意有点坑,先放一放吧,今天太晚了,以后再来填。。 = =代码如下(借鉴着别人的代码,自己也写了个 ,因为写得比较挫,INF由于一直加,会原创 2013-09-07 23:40:39 · 954 阅读 · 0 评论 -
UVALive 4614 Moving to Nuremberg
题目大意:给你一棵树,有一些点你需要去,并且有一定的次数,每去一个点,你都要回来一趟,让你选择一个点,使这个总和最小。思路:一看数据范围,暴力是肯定不行的。树嘛,那就肯定是树形DP。考虑一个节点 u,它有一个儿子是 v,设 d[ v ] 为以 v 为选择点的总和,因为是考虑来回,那么就读入的时候将所有边权都*2 就好了,那么 d[ v ] = d[ u ] + (sum_time - time原创 2013-09-02 11:55:10 · 695 阅读 · 0 评论 -
UVALive 3637 The Bookcase
题目大意:有 n (3 这个最小,问你这个最小值。思路:设 d[ i ][ i ][ j ] 表示前 i 本,第二层的 t 和为 j,第三层的 t 和为 k 的二三层的最大高度之和的最小值。我们先把所有书按照高度从大到小排序,则每进来一本,只要该层的不为空,则这本书的高度就不会影响到 d 值,也就是每层的高度只取决于该层放进来的第一本书,每本书只有三种选择,放第一层,或者第二层,或者第三层,原创 2013-09-07 13:57:05 · 855 阅读 · 0 评论 -
UVALive 5088 Alice and Bob's Trip(树形DP)
题目大意:给你一棵有n个点的树,根节点编号0,现在Alice 和 Bob要去旅行,Alice 想要边的和尽可能小,Bob想要尽量大,但是两个人都必须要使这个和在区间 [ l , r ],每人轮流选一条边,Bob 开始选,问你最大的和。思路:树形DP,设d[ u ][ 0 ] 表示以u为根节点的子树,先有 Alice 选的最大和,d[ u ][ 1 ] 表示 Bob 先选的最大和,由于树中从根节原创 2013-10-04 10:57:18 · 907 阅读 · 0 评论 -
BZOJ2037 [Sdoi2008] Sue的小球 (费用提前计算相关的DP)
题目大意:二维坐标系,有n个小球,每个有一个初始坐标,和一个下降速度,沿着y轴负方向以速度v下降,有一个人,初始坐标为 st ,要把中n个球都拿到,他可以沿着x 轴正负方向走,走到这个小球的x 坐标相同时就可以把他得到,得到的分数是 yi - t * vi ,t 为他走到这个小球下方的时刻,人的行走速度为 1格1个单位时间,问你把所有者n个球都拿到的最大分数。思路:难点和重点就在于每次移动都要原创 2013-10-05 13:25:22 · 1206 阅读 · 0 评论 -
UVA 10559 Blocks
题目大意:方块消除游戏,给你一个n个方块的序列,相同颜色的一段可以同时消掉,得分为 len^2,问你得分最高时多少?思路:借用POJ discuss 里的一句话来说,这道题真是优质DP啊。。。 具体解题思路可以看黑书,也可以看这里:http://wenku.baidu.com/view/83d0a76925c52cc58bd6bea8.html,说的很不错。我只是简单的填个坑:设 d[ i原创 2013-10-04 20:09:18 · 1282 阅读 · 0 评论 -
poj 3670 Eating Together(最长不下降子序列、LIS)
题目:http://poj.org/problem?id=3670题目大意:就是给你n个数,让你删除尽量少的数,然后让它变成最长不下降或者不上升子序列。思路:就是求这个序列的最长不上升和不下降子序列,然后 ans = n-max(n1,n2)。不上升懒得写了,直接把原数组翻个向,求lis。代码如下:#include#include#includeusing namespa原创 2013-11-01 18:17:59 · 1124 阅读 · 0 评论 -
hdu 4784 Dinner Coming Soon(spfa+优先队列优化)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4784题目大意:现在给你N个点,M条youxiangbian原创 2014-10-26 14:41:05 · 653 阅读 · 0 评论 -
ZOJ 3605 Find the Marble(DP)
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4708题目大意:A和B玩游戏,A一开始放了个弹珠在第 s 个罐子了,然后他交换罐子,交换了m次。B看到了他交换 k 次,并且认为这就是 A 交换的所有动作。问你最后 B 猜弹珠在哪个位置的可能性最大,如果一样,就输出编号最小的。解题思路:这种题目想想也知道肯定是dp原创 2014-04-10 21:27:47 · 749 阅读 · 0 评论 -
POJ 2127 Greatest Common Increasing Subsequence(LCIS+输出路径)
题目:http://poj.org/problem?id=2127题目大意:给你两个序列,求出LCIS,然后原创 2014-04-05 19:27:25 · 705 阅读 · 0 评论 -
hdu 4433 locker(DP)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4433题目大意:就是给你一个序列,相当于一个可以转的那种密码锁的初始状态,0往下转是9,9往上转是0,现在你要把它转成一个指定的序列,每次可以转动连续的1~3个数字,问你最小的操作数。思路:DP题这是很清楚的,可是状态有点不好设计。设d[ i ][ x ][ y ] 表示前 i 个已经转好,然后 i原创 2013-10-31 18:07:30 · 698 阅读 · 0 评论 -
UVALive 2930 Minimizing Maximizer(最小区间覆盖数 DP + 线段树优化)
题目大意:简单来说就是,给你一个1~n的区间,现在m个线段l~r来填,问你最小的把1~n覆盖的最小的线段数,m个线段要按顺序来。(反正我是没怎么理解题意,看了别人才理解题意的。。 = = )思路:dp的想法是很明显的,设d[ i ] 表示1~i 的最小的覆盖数,d[ i ] = min(min(d[ j ] +1),d[ i ]),a因为LA上交不上去,然后就去POJ,可是一直RE,还以为原创 2013-09-27 11:30:06 · 893 阅读 · 0 评论 -
UVALive 2221 Frontier(计算几何 + DP)
题目大意:有n个tower,m个monument,要求n个点中找出几个点围成一个凸多边形包含这m个点,使这个多边形周长最小,输出这个周长。思路:m个点全都要被包含,明显只关系到最外围的点,那么把m个点求凸包,然后考虑如果取某个点为起点顺时针走,那么一个一个点加进去,最后这个点可以和前面的点连接,设中间这个点是k,然后d[ i ][ j ] = min(d[ i ][ k ] + len(k原创 2013-09-24 23:47:11 · 677 阅读 · 0 评论 -
spoj 1526 (BOI2007 day1) (费用提前计算相关的DP)
题目大意:给你n个人的分数,让你从大到小排序,现在只有一种操作,将 i 个分数变成 j 个分数,其他分数的相对顺序不变,费用为 i + j,问你完成操作最小的费用。思路:具体看论文吧:看了半天,终于有点那么理解,代码敲了一点敲不下去了,有个地方处理不好,唉,感觉好复杂的一道题目啊,自己想肯定是想不出来的,先放放吧。。有两个代码,乱搜搜出来的,先放上来吧,过段时间再来研究:代码1:原创 2013-10-05 23:38:59 · 955 阅读 · 0 评论 -
UVALive 3610 Log Jumping
题目大意:给你n条横的块,每条块的长度是k,然后给你n个的左起点,如果两者有重叠,那么就可互相跳过去,临界条件也是可以跳的,问你点数最多的环,然后输出这个点数。思路:这题有一个很巧妙的做法,先把坐标排序,然后就是往后找,假设当前 i 已经加入了前面的圈子,那么现在要判断 i+1 能不能加进去,它能加进去的条件是 x[ i + 1] - x[ i - 1 ] 其实这种题目更一般的做法(包括我原创 2013-09-21 21:30:44 · 778 阅读 · 0 评论 -
UVALive 3782 Bigger is Better(数位DP + 大数)
题目大意:每个数字可以分别由几根火柴棒拼起来,给你火柴棒的总数 n ,和 m ,问你用n个火柴棒去拼出来的最大的能被m整除的数是多少?思路:很裸的数位DP,只是其中有个大数处理,这也是比较麻烦的地方。。。= = 设 d[ i ][ j ] 表示用 i 根火柴棒去拼,当前已有的余数为 j 的最大整数,则d[ i ][ j ] = max( d[ i - size[ num ] ][ ( j*1原创 2013-10-06 13:31:09 · 995 阅读 · 0 评论 -
UVALive 3942 Remember the Word(trie + dp)
题目大意:给你一个字符串str,然后给你n个单词,让你用这些单词去组成这个字符串,问你有几种分解方法?思路:先开始是一个dp,设 d[ i ] 表示从 i~len-1 的方案数(注意是后缀),有关系式 d[ i ] = sum(d[ i + x]),其中这 x 个字符是一个单词。但是如果朴素的做,肯定TLE,有4000个单词,长度最长是100,str的长度也为300000,。所以这里用trie原创 2013-10-07 11:31:44 · 745 阅读 · 0 评论 -
UVALive 4031 Integer Transmission
题目大意:有n个比特,数字是 k ,现在要传输这n个比特,从左到右传输,每个比特传输有延迟,第i个比特到达的时间是 i ~ i+d,如果有多个同时到达,则顺序任意,问你能组成的数字的种数是多少,还有最大最小值是多少?思路:最大最小值很好求,关键是那个种数,DP想了半天没想出来,没有好的思路,网上乱搜了两个代码,看了半天都没看懂,先贴上来吧,以后有时间再来搞。。如果有哪位大神路过,希望能指点原创 2013-10-06 22:45:06 · 1009 阅读 · 0 评论 -
UVALive 3608 Period(二分答案+DP)
题目大意:给你两个字符串a、b,可以把a分成任意段,然后分别转换为b,有三种操作,把一个字母替换掉,把一个字母删掉,在指定位置插入一个字母,问你a分段,然后各自转换为b,最小的操作总数。思路:先二分答案,然后设d[ i ][ j ] ,像最长公共子序列一样进行DP,相同的+0,不同的+1,这里还有个关键,就是分段,那么我们判断d[ i ][ m ] ,如果d[ i ][ m ]自己想的时候原创 2013-09-20 22:22:55 · 750 阅读 · 0 评论 -
UVALive 3605 Roommate
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3069题目大意:有两个人,他们在某一天各要依次用一些物品,每种物品只有一个,也就是相同的物品不能在同一个时间段用,每个人用每个物品都有一个时间,问你怎么安排,使他们都用完的时间最小,然后输出这个最小时间。思路:很明显的DP,设两个为p、q, i、j 这两个维是很明显原创 2013-09-20 15:12:02 · 981 阅读 · 0 评论 -
poj 1485 Fast Food
题目:http://poj.org/problem?id=1485题目大意:一条直线上,给你 n 个点,按照坐标从小到大,给你这 n 个点的坐标。现在要求你在这 n 个点中选择 k 个建造仓库,每个点有且只能对应一个仓库,一个仓库可以对应若干个点。现在要使每个点到其对应仓库的总距离最小,让你输出这个最小值,并输出路径。思路:DP。设 d[ i ][ j ] 表示前 i 个点,建造 j 个仓原创 2013-09-06 11:07:01 · 991 阅读 · 0 评论 -
UVALive 4048 Fund Management
题目大意:你有c美元,没有股票,给你m天时间和n支股票供你买卖,每天只能买卖一手股票,对于第i支股票,知道他的第j天的每股价格为Pij,一手为si股,且每天最多能持有ki手这支股票,且所持股票的总手数不能超过k,问你m天后最多能得到的钱(最后一天结束时不能持有任何股票),并打印路径。思路:一看数据范围,很容易想到是状压。我的思路是开d[ i ][ j ] 表示前i天手上每支股票的手数为j,则原创 2013-08-18 16:54:00 · 1329 阅读 · 0 评论 -
UVA 11795 Mega Man's Mission
题目大意:洛克人打怪,他先开始有一把武器,可以杀死某些怪物,他杀死每个怪物,就可以捡起那个怪物的武器,每个怪物的武器又可以去杀死另外的一些怪物,问你杀死这些所有的怪物,总共有多少种方案?思路:简单状态压缩DP。d[ s ] 表示杀死怪物状态为s(1表示还或者,0表示已经死了)的总方案数,先预处理出对于每个s,他已经拿到了能杀死哪些怪兽武器,即对于s中的每个0处理一下,状态转移方程为:d[s ]原创 2013-08-03 10:32:03 · 1052 阅读 · 0 评论 -
UVA 11404 Palindromic Subsequence
题目大意:求最长回文子串,并输出其中字典序最小的。思路:转化为LCS。将原来字符串反转,得到str2,然后和原字符串求LCS,求LCS的过程中还需要记录每一个状态所对应的的LCS,因为之后要比较。然后再分两种情况(1)回文串为偶数,那么当str1位置为i时,str2的位置应为len-i。(2)为奇数,那么考虑中间字母为str1[ i ]时,str1的位置为i-1,str2的位置为len-i,这原创 2013-08-02 19:20:23 · 1387 阅读 · 2 评论 -
UVALive 3530 Martian Mining
题目大意:给你一个n*m的矩形,每个点有两种矿,一种要运到west去,一种要运到north去,让你在每个格子上建两种运送带,一种方向是west的,一种是north的,要求一个格子最多只能有一种带,而且传送带不能断,之后能运到边界才算有效,而且不能曲折,问你两种矿的和最大是多少?思路:设d[ i ][ j ] 为前i行,前j列的最大和,每个格子只可能有一种方向的传送带,要么横,要么竖,那么d[原创 2013-08-03 12:46:35 · 914 阅读 · 0 评论 -
UVALive 4727 Jump
题目大意:约瑟夫环,给你n,k,让你输出最后三个被淘汰的是谁,然后输出。思路:和约瑟夫环一样,为了处理方便,先把编号改为0开始,最后一个被删的,在人数为1时很明显,就是0,倒数第二个被删的,在人数为2时最明显,编号为(k-1)%2,倒数第三个时三个人,为(k-1)%3,然后一样,按照公式f[ n ] = (f[ n - 1 ] + k ) % n 。往前推就好。代码如下:#includ原创 2013-08-03 10:36:18 · 877 阅读 · 0 评论 -
UVALive 4731 Cellular Network
题目大意:给你n个数,和一个w,每个数的概率是把这个数的值/n个数总值,让你把这些n个数分成w组,每个组的值为这个组加上前面所有组的数字个数之和*这个组的概率之和,要使所有的这些组的和最小。思路:因为每个组的概率之和前面要乘系数,而且是越早选越小,那么我们把所有数字按照大小,从大到小排序,但由于一个组加进去数字如果过多,它前面的系数也会变大,使前面那些大数去乘一个比较大的系数,这里就需要DP一原创 2013-08-02 20:57:19 · 810 阅读 · 0 评论 -
UVA 11552 Fewest Flops
题目大意:给你一个字符串,要你按每组k个按照顺序进行分组,每组里的字母顺序可以乱动,然后再按照组的顺序拼起来,如果相邻的几个相同的字母算一个“chunks”,问你拼起来后,最少的“chunks”是多少?思路:简单DP题,要最小每个组里相同字母肯定是放在一起的,然后如果拼接时上一个的尾,和这一个的头字母是一样的,那么就要两者和减一,设d[ i ][ j ] 表示前i,且第i个的尾部的字母是j的最原创 2013-08-02 15:22:28 · 869 阅读 · 0 评论