
ACM_动态规划
文章平均质量分 76
Nero___
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
UVA 1474 Evacuation Plan
题意: 在一条直线上有n个队员,m个避难所,他们都有各自的坐标,现在要让所有的队员进入避难所,且要求每个避难所至少有一人,求队员移动的最小距离和。要求输出每个队员进入的避难所编号。数据范围4000。解法: 设dp[i][j] 表示前j个队员进入前i个避难所得最小移动距离和,那么有如下转移:dp[i][j] = min(dp[i-1][j-1], dp[i][j-1]) + 队员j和避难所i原创 2013-09-05 22:51:36 · 1077 阅读 · 0 评论 -
UVA 672 Gangsters
题意: 一家饭店,有一扇大小会变得门,变化范围为[0,k]。每过一单位时间你可以让门的大小+1,-1,或者不变。客人会在不同的时间来吃饭,但是如果门的大小和他们希望的值不一样,他们就不会进来并且直接消失。吃饭要花钱,现在问饭店最多能赚多少钱。解法: 设dp[i][j] 为时间i门的大小为j时最多能赚的钱,那么有如下转移:dp[i][j] = max(dp[i-1][j-1], dp[i-1原创 2013-08-28 20:06:05 · 1015 阅读 · 0 评论 -
UVA 607 Scheduling Lectures
题意: 现在你作为一名老师要去上课,你要在最短的课时内将n个主题讲完,每节课有固定的时间,每个主题必须在同一节课讲完,主题必须按给定的顺序讲。如果你上某节课剩余时间过多,学生会产生不爽值(窝曹,这是哪里的学生)。求最短课时和再最短课时前提下学生的最低不爽值。解法: num[i]表示讲完第i个主题,所用的最少节课,idx[i]表示讲完i个主题,用了num[i]节课的最低不满意度对num进行d原创 2013-08-28 19:58:28 · 1005 阅读 · 0 评论 -
LA 3363 String Compression
区间DP题意: 对于一个字符串中的重复部分可以进行缩写,例如”gogogo“可以写成“3(go)”,从6个字符变成5个字符。现在问在这个规则下,问给定一个串的最短长度是多少。解法: 这题我参考了这里设dp[i][j]为串[i,j]最短的长度。有如下状态转移: dp[i][j] = min(dp[i][k]+dp[k+1,j]])。当区间[i,j]为重复串时,dp[i][j] =原创 2013-08-28 17:51:35 · 969 阅读 · 0 评论 -
UVA 10534 Wavio Sequence
题意: 给定一个长度为n的整数序列,求一个最长子序列(不一定连续),使得该序列长度为奇数(2*k+1),且前k+1个数严格递增,后k+1个数严格递减(n解法: 对原序列正着做一次最长上升序列,再逆序做一次最长上升序列。然后枚举每一个点,取每个点的正序最长序列长度和逆序最长序列长度的最小值中的最大值maxn,这个maxn只是答案的左半部分,所以答案是maxn*2-1。注意由于数据范围是1W,此处原创 2013-08-28 15:59:56 · 840 阅读 · 0 评论 -
UVA 11584 Partitioning by Palindromes
题意: 给出一串字符串,要求将它划分成尽量少的字符串,使划分后的所有子串都回文。解法: 设dp[i]为将0~i划分后的最少回文子串数,有如下状态转移:dp[i] = dp[j] +1,0<=j<i且区间[j+1,i]回文。/* **********************************************Author : NeroCreated Time:原创 2013-08-28 15:42:30 · 957 阅读 · 0 评论 -
UVA 10453 Make Palindrome
区间DP题意: 问最少增加几个字符,能使给定串回文。并输出串。解法: 设dp[l][r]为区间[l,r]最少增加几个字符能够回文,所以dp[l][r] = min(dp[l+1][r], dp[l][r-1]) + 1,大串由小串推知,而且在推大串时他的所有小串都已推完,因此这个方程是完备的。打印路径DFS一遍即可。/* ********************************原创 2013-08-27 12:54:42 · 872 阅读 · 0 评论 -
LA 4731 Cellular Network
题意: 存在一个蜂窝网络,有n个部分,有一部手机存在着n个部分中的某一个,给定每个部分的存在概率,现在要将这n个部分分成w块,每一块内的部分同时访问。让你完成划分并输出找到手机的最小访问块数期望。解法: 显然可以知道先访问大概率的部分,能使期望最小。所以先将n部分按概率从大到小排序,每次划分块时选择连续的一段。虽然顶着概率DP题的外表,但是实际上求期望的公式题目是给出了(虽然题目略长),设原创 2013-08-26 14:01:28 · 1317 阅读 · 0 评论 -
UVA 10817 Headmaster's Headache
状态压缩DP题意: 某校有n个教师和m个求职者,已知每人的工资和能教的课程集合,要求支付最少的工资使得每门课都至少有两名教师教学。在职教师必须招聘。解法: 传送门第一次遇到状态压缩DP开二维,之前本人的思路一直卡在如何在一个16进制位中表示选了1次和选了2次这种状态,即如何从选1个的位进位到选两个的位。原来开二维就可以轻松解决。。目前的整体感觉是,DP是去寻找一个状态,能够记录下求原创 2013-08-26 12:13:07 · 968 阅读 · 0 评论 -
POJ 2486 Apple Tree
树形DP+背包题意:给一棵树,每个点有相应的价值,要求从节点1开始走最多k步,问能取得的最大价值。重复经过的点不算。分析:这题的特点是走到叶子节点后回返也需要消耗步数。思路:设状态g[i][j]表示以i为根的子树走j步不回到根的最大价值,状态b[i][j]表示以i为根的子树走j步最后回到根的最大价值所以 b[u][i+j+2] = max(b[u][i+j+2],原创 2013-08-12 11:05:32 · 731 阅读 · 0 评论 -
POJ 1417 True Liars
题意:有p个好人,q个坏人,他们说了n句话,格式为A说B是好/坏人坏人全说谎话,好人全说真话,问你能不能知道他们中全部的好人是谁。解法:划分好人为一类,坏人为一类,简单分析可得,同类会对同类说yes,对非同类说no。所以通过并查集就可以知道每个集合内的划分关系。这题的难点在于,题目给出的关系可能描述不同的集合,那么你就需要把这些集合拼凑在一起,看能不能仅得到一种构成p个人的组合。因原创 2013-08-05 11:28:05 · 900 阅读 · 0 评论 -
HDU 4616 Game
树形DP题意:给一棵树,树上的每个节点会有财富,某些节点会有陷阱,现在你可以从任意节点开始走,不能往回走,碰到第C个陷阱就停,问能获得的最大价值。思路:开三维状态,分别是【当前节点】【已经遇到的陷阱数】【是否从陷阱开始】,值表示从这个节点的子节点在相应情况下能取得的最大值。那么最长的那条路必然是由两棵子树的最大值合并而成或者就是从这个节点到子树的某处的价值。需要注意的是合并时候的情况。原创 2013-07-26 19:27:02 · 911 阅读 · 0 评论 -
HDU1561 The more,The better
树形DP,分组背包DP题意:从n座城堡中选m座城堡使财宝总量尽量大。有的城堡需要先攻克其他特定的一座城堡思路:明显的树形结构,增加一个虚拟的0节点就是一棵树。设状态dp[i][j]为在以i为根的子树上选择j个节点的财富最大值在非0节点上的其他点都必须选择他自己,所以非0节点从1开始记数华丽丽的被卡了一天,即使到现在重写第3次AC了还是不知道为什么错。头疼啊头疼#include #include原创 2013-07-18 19:32:26 · 621 阅读 · 0 评论 -
《训练指南》DP::beginner解题报告
几天时间总算是敲掉了beginner部分的25题, 在大神博客的启发下,在此整理一下我的思路和代码。原创 2013-08-28 20:08:03 · 1300 阅读 · 2 评论 -
状态压缩DP基础题解题报告
POJ 2411铺砖块最基本的题。设DP[i][state]为贴到第i行,前一行的状态为state时的方法数,枚举两层的状态来转移,先判断转移是否合法(即保证上一层是贴满的)。原创 2013-09-25 01:15:56 · 1618 阅读 · 4 评论 -
Codeforces 360C Levko and Strings (dp)
http://codeforces.com/problemset/problem/360/C令串下标从1到n,分析 t[i] 与s[i] 的三种情况:大于,等于,小于。仅当t[i]>s[i]时会产生beauty relative,且产生的数量为 (n-i+1)*(i-j+1),j为i之前最后一个t与s不同的位置。设状态 f[i][j][k] 为在第i位,有j对beauty relati原创 2013-11-13 20:27:16 · 1689 阅读 · 0 评论 -
2013 长沙Regional I题:LIKE vs CANDLE (树dp)
下面用0表示LIKE,1表示CANDLE。设状态fw[u]表示以节点u为根的子树的 0-1 的最大值,用rv[u]表示以节点u为根的子树的 1-0 的最大值。则:fw[u] = max(rv[u]-cost,sigma(fw[v]))rv[u] = max(fw[u]-cost,sigma(rv[v]))v 为u的子节点。而每个节点只考虑翻或者不翻,因此花费分别为X或Y。cos原创 2013-11-24 22:12:53 · 1622 阅读 · 0 评论 -
ZOJ3494 BCD Code (AC自动机+数位DP)
用AC自动机构造出病毒串的trie图,然后设状态dp[i][j]表示长度为i且位于j节点时的符合要求的数的数量,然后按照普通数位DP做即可递推式数位DP统计[1,x]内符合条件的数只需要考虑三种情况:1,位数比x短的数2,位数和x一样,但是某一位比x小的数3,x本身是否符合条件0比较特殊,在一般的数位DP中需要特殊处理,一般以特判为主AC自动机的话,即trie树+fail树原创 2014-03-08 19:46:59 · 1223 阅读 · 0 评论 -
UVA 1427 Parade
单调队列优化DP题意: F城由n+1个横向路和m+1个竖向路组成。你的任务是从最南边的路走到最北边的路,使得走过的路上的高兴值的和最大(高兴值可能为负数)。同一段路最多只能走一次,且不能从北往南走。另外,在每条横向路上所花的时间不能超过k。1解法: 很容易想到设dp[i][j]到第i行第j列那个点的最大值,设L[i][j]为从第i行的左边走到i的最大值,R[i][j]为从第i行的右边走原创 2013-08-30 22:31:06 · 1005 阅读 · 5 评论 -
ZSTU 4119 Juice
树形DP+分组背包题意: 给一个树,0节点具有无限能源,边权值表示边最大能源流通量,非0节点权值表示点亮该节点需要的能源(允许0),求最多能点亮多少个节点。思路: 状态dp[i][j]表示以i为根的子树话费j能源能点亮的节点最大值。每个节点的背包容量上限为该节点到其父亲的那条边的边权其实很水的一道DP。本人卡了一天多的原因,完全是因为背包没有掌握好,对0权值节点处理不当T_T#in原创 2013-07-19 10:08:57 · 727 阅读 · 0 评论 -
POJ 1947 Rebuilding Roads
树形DP+分组背包题意: 给一棵n个节点的树编号1~n,要从中截出一棵k个节点的树,最少需要删除几条边思路: 设dp[i][j]为以节点i为根的子树删除j个节点需要删除的最小边数由于我不能确定根是哪一个,所以我加的双向边随便找个节点为根DFS一遍,对每个节点作1~num[i]-1的分组背包(-1是因为最多只能删num[i]-1个节点)(num[i]是以节点i为根的子树的节点原创 2013-07-19 13:27:12 · 622 阅读 · 0 评论 -
UVA 12235 Help Bubu
状态压缩DP题意: 书架上有n本书,给出一个书的高度的序列,我们把相邻的高度相同的书看成一个片段,并且定义该书架的混乱程度为片段的个数。为整理书架,你最多可以从中拿出k本书,然后再把他们插回书架(其他书的相对顺序保持不变),使书架的混乱程度降至最低。1解法: 书高只有8种,入手点。设状态dp[i][j][s][k]为在第i本书,取了j本,留下的书的集合为s,留下的书的最后一本为k时的留原创 2013-09-01 00:14:05 · 1420 阅读 · 0 评论 -
UVA 590 Always on the run
题意: 一个贼打算偷窃一副很贵很贵的画,于是现在要设计逃跑路线。他打算花k天时间,每天坐飞机从一个城市飞往另一个城市,第一天从城市1出发,第k天要求到达城市n。而飞机的价格每天都不一样(存在确定变化周期),有的地方有的航线有时候会关闭,若不能找出这么一条k天的路线,输出“悲剧逃不掉”,否则输出买机票的最小费用。解法: 设dp[k][i] 为第k天到达城市i的最小代价,于是有状态转移: dp原创 2013-08-28 19:44:51 · 1080 阅读 · 0 评论 -
LA 2038 Strategic game
树形DP题意: 给定一棵树,选择尽量少的节点,使得每个没有选中的节点至少和一个已选节点相邻。解法: 关于树形DP,题目通常给的是无根树,那么随便选择一个节点当做根好了,这不影响解题。题目的限制是,如果一个节点没被选中,那么和它相邻的节点至少选一个,若一个节点已选,那么和它相邻的节点选或不选都可以。那么,在树中的体现是,对于一个非根节点,他的限制来自于它的父亲(对于根我们不设限制),若它的父原创 2013-08-28 17:39:14 · 1019 阅读 · 2 评论 -
UVA 11552 Fewest Flops
题意: 输入一个正整数k和字符串s,串的长度保证是k的倍数,把s的字符按照从左到右的顺序每k个分为一组,每组之间可以任意重排,但组之间的先后顺序保持不变。你的任务是让重排后的字符串包含尽量少的“块”,其中每个块为连续的相同字母。解法: 设dp[i][j]为以字母i结尾块数为j的串的最少块数,有如下状态转移:若块j的元素种类大于1,块j中存在元素x且块j中的元素种类为m,则dp[i][j]原创 2013-08-28 16:17:54 · 810 阅读 · 0 评论 -
LA 4256 Salesmen
题意: 给定一个包含n个点的无向连通图和一个长度为L的序列A,你的任务是修改尽量少的数,使序列中任意两个相邻数或者相同,或者对应图中相邻的两个点。解法: 设dp[i][j]为第i个数为j时的最小修改数。则dp[i][j] = min(dp[i-1][k]), 其中k为与j相等或在图中相连的数。若原本i位置的值不为j,则dp[i][j]还需加1。/* ****************原创 2013-08-28 15:52:14 · 1443 阅读 · 0 评论 -
UVA 607 Fast Food
题意: 在一条直线上有n个餐馆,现在要在直线上放置k个仓库,求使所有餐馆到最近仓库的距离之和最小的方法(打印每个仓库的覆盖范围),和这个最小值。解法: 我们先预处理出在每一段[l,r]区间放置一个仓库能取得的最小距离和dis[i][j],设dp[i][j]为前j个餐馆使用了i个仓库的最小距离和,状态有如下转移:dp[i][j] = min(dp[i][j], dp[i-1][k] + di原创 2013-08-28 11:46:38 · 875 阅读 · 0 评论 -
UVA 473 Raucous Rockers
原文题意: 有n首音乐,m个磁盘,磁盘容量都是t,一首音乐不能被分割到两个盘里,问最多能在磁盘里放置多少音乐。要求音乐的放置不能逆序。即下标大的不能放在下标小的前面。解法: 设状态dp[i][j][k]为在第i首音乐,已放置到第j个磁盘,且第j个磁盘已使用k个单位空间时能放置的最大数量。状态的转移: 1: 当不放置这首歌时,dp[i][j][k] = max(dp[i][j][原创 2013-08-27 23:13:00 · 1095 阅读 · 0 评论 -
UVA 10564 Paths through the Hourglass
题意: 给一个漏斗形状的图,让你从最上面走到最下面,问有几种走法。并打印下标最小路径。解法: 走法数量明显简单DP一下就可以得到,对于要求的下标最小路径,我们可以在DP时从最下方递推上来,然后就可以很方便的从最上方一遍递推找出要求的路径了。/* **********************************************Author : NeroCreated原创 2013-08-26 03:00:47 · 972 阅读 · 0 评论 -
UVA 11795 Mega Man's Missions
状态压缩DP题意: 洛克人现在手上有一个武器,能够杀死指定的敌人,而杀死敌人后能够获得新的武器,新的武器也只能杀指定的人。问杀死所有敌人共有多少种方法。数据范围n解法: 状态压缩DP,注意要维护每个状态下能杀死的敌人。我写的记忆化搜索,因为递推写搓了。。/* **********************************************Author : Ner原创 2013-08-26 00:36:38 · 1258 阅读 · 0 评论 -
CF-161D Distance in Tree
题意: 给出一棵树,边长度皆为1,问距离为k的点对有多少组,相同点对算一组。解法: 设dp[u][i]为以u为根的子树中与u的距离为i的点有多少,DFS一遍即可。#include #include #include #include using namespace std;#define REP(i,a,b) for(int i=(a); i<(b); i++)#define原创 2013-08-18 18:32:49 · 1047 阅读 · 0 评论 -
LIGHTOJ 1018 Brush (IV)
题意: 给平面上n个点(n解法: 16个点,又是在DP分类,没怎么想就是状态压缩DP了。先预处理点两两之间组成的直线经过的点集line[i][j]。然后每次枚举两个点就可以了。#include #include #include using namespace std;#define clr(a,b) memset(a,b,sizeof(a))#define REP(i,a,b)原创 2013-08-14 16:58:29 · 855 阅读 · 0 评论 -
UVA 437 The Tower of Babylon
题意: 给出一些种类的立方体,每种立方体有无数个,问你用这些立方体最高能堆到多高。限制是放在上面的立方体的长,宽要分别严格小于放在下面的立方体的长,宽。解法: 一个立方体有长宽高三个属性,索性把一个能旋转立方体拆成6个不能旋转的立方体,然后将立方体排序,做2维偏序的最长上升序列就可以了。设状态dp[i]为以第i个立方体结尾的最长上升序列长度,那么dp[i] = max(dp[i], d原创 2013-08-28 19:29:14 · 886 阅读 · 0 评论 -
LA 2031 Dance Dance Revolution
题意: 一个胖子要在跳舞机跳舞,有上下左右4个键,每次移动都需要消耗体力(停着不动也需要消耗1点),问这个胖子最小要消耗多少体力能够完成给定的方向串。解法: 设dp[i][j][k]为左脚在i,右脚在j,第k个字符时的最小体力,step为现在要踩的方向,有如下状态转移:dp[i][step][k] = min(dp[i][j][k-1] + count(step,j))dp[step]原创 2013-08-28 18:49:34 · 907 阅读 · 0 评论 -
LA 3530 Martian Mining
题意: 给出n*m网格中每个格子的A矿和B矿的数量,A矿必须由右向左运输,B矿必须由下向上运输,管子不能拐弯或间断(即往上和往左的路线不能有交集)。要求使手机到的A,B矿总量尽量大。解法: 观察图片可知,对于n*m网格的右下角那一个,即[n][m],这一格如果往上, 则第m列整列都必须往上运输,如果往左,则第n行整行都必须往左,对整个矩阵的其他位置的选择并没有影响。那么设dp[i][j]为原创 2013-08-28 16:52:06 · 1120 阅读 · 2 评论 -
UVA 10163 Storage Keepers
背包DP题意: 有n个仓库需看管,现在有m个人应聘,每个人有一个价值p[i],雇佣这个人需要花费p[i],问最大的保险值是多少,以及保证最大保险值时的最小花费。一个仓库保险值就是看管每个仓库的人的价值,但是管理员可以同时看管多个仓库,这时对应仓库的保险值为p[i]/x,x为该管理员同时看管的仓库数。总的保险值为所有仓库保险值的最小值。一个仓库只能有一个看管者。如果不能保证保险值大于原创 2013-08-27 12:27:03 · 920 阅读 · 0 评论 -
UVA 11404 Palindromic Subsequence
区间DP题意: 给定一个串,要求删除尽量少的字母,使剩下的部分回文。输出字典序最小的剩下的回文串。解法: 设dp[l][r]为使闭区间[l,r]回文的最小删除数量,[l,r]从[l+1,r],[l,r-1],[l+1,r-1]三个区间来转移。路径就边递推边保存就可以了。原作好犀利啊。显然当状态推至[l,r]时,[l,r]之间的部分必然已经推过,复杂度为n^2。代码来自这里/*原创 2013-08-26 00:28:37 · 903 阅读 · 0 评论 -
CF-337D Book of Evil
树形DP题意: 在一棵树上的某个节点有一本书,在这本书附近的距离d范围内的节点会出现鬼怪,现在给出部分鬼怪的位置,问书的位置有几种可能。节点数10W解法:简单分析知,若一个节点和鬼怪的最远距离大于d,那么书就不可能在这里。设dp[u][0],dp[u][1]分别为以u为根的子树中鬼怪距离根节点的最远距离和次远距离,这个在第一遍dfs就可以全部求出。然后第二遍dfs将父节点的最远距离传入子节原创 2013-08-17 13:24:23 · 919 阅读 · 0 评论 -
UVA 1252 Twenty Questions
状态压缩DP题意: 有n个长度为m的二进制串,每个都是不同的。为了把所有字符串区分开,你可以询问,每次可以问某位上是0还是1。问最少提问次数,可以把所有字符串区分开来。解法: 设dp[s1][s2]为询问集合为s1,答案为s2,还需要询问几次能区分开。所以有:dp[s1][s2] = 0 ,当和答案s2相同的串个数小于等于1时。dp[s1][s2] = min(dp原创 2013-08-28 19:04:19 · 1439 阅读 · 0 评论