【动态规划】
nyist_xiaod
这个作者很懒,什么都没留下…
展开
-
HDU 2089 不要62(数位DP入门)
题目链接:Click here~~题意:统计区间 [a,b] 中不含 4 和 62 的数字有多少个。解题思路:dp[len][0] 表示长度为 len 的数字不含 4 和 62 的个数。dp[len][1] 表示长度为 len 的数字不含 4 和 62 但首位不为 2 的个数。状态转移方程为:dp[i][0] = 8 * dp[i-1][0] +原创 2013-07-11 09:35:15 · 16096 阅读 · 9 评论 -
FOJ 2136 取糖果(单调栈)
题目链接:Click here~~题意:给一个长度为 n 的序列,对于所有的 k ,询问 min{ max{Ai ~ Ai+k} }。解题思路:对于类似 min{ max{} } 的问题,很容易想到二分,但是二分法好像解决不了这个问题,因为询问是 O(n) 的。做法是先用 单调栈 可以 O(n) 预处理出每个 Ai 作为区间最大值能扩展到的最远位置,记为原创 2013-11-30 08:19:23 · 968 阅读 · 0 评论 -
HDU 4395 D-mail(DP)
题目链接:Click here~~题意:给 n 个数字,选取一些取它们的和 S,取和的过程中 S 不能超过2,求出最接近目标数字 D 的 S。(数字均为 4 位小数)解题思路:很明显的 dp 模型,状态 dp[i][j] 表示前 i 个数字是否能取到和为 j 的情况。由于条件的限制,第一维可以滚动,第二维的有效区间为 [-20,2] , 映射成整数是 [原创 2013-10-15 11:15:26 · 1291 阅读 · 0 评论 -
CF 191A - Dynasty Puzzles(简单DP)
题目链接:Click here~~题意:有若干个字符串,求一个最长的环,且顺序必须满足给定顺序,即后面的串只能接在前面的串的后边。解题思路:令dp[i][j]表示从字母 i 到字母 j 所能走过的最长长度。设某串长度为len,则状态转移方程为dp[k][j] = max(dp[k][j],dp[k][i]+len).k∈{a,b,…z}且要注意两原创 2012-08-01 11:13:28 · 1188 阅读 · 0 评论 -
CF 55D - Beautiful numbers(数位DP)
题目链接:Click here~~题意:如果一个数能被自己各个位的数字整除,那么它就叫 Beautiful numbers。求区间 [a,b] 中 Beautiful numbers 的个数。解题思路:先分析出,2~9 的最大的最小公倍数是 2520({5,7,8,9})。于是让 dp[len][mask][remaind] 表示长度为 len原创 2013-07-11 18:28:37 · 2186 阅读 · 0 评论 -
HDU 2196 Computer(经典树形DP)
题目链接:Click here~~题意:给一颗树,求出每个点到其距离最远的点的距离。解题思路:超经典的树形DP,最近经常遇到这种题目,一定要把这道题写篇博客记录下。考虑到树中每个点的最远距离其实只有两种情况。(Note:from sons or father)首先从根节点跑一次 dfs,很容易求出 u 到子树中的最远距离和次远距离,解决了 fro原创 2013-08-18 10:16:52 · 2980 阅读 · 0 评论 -
HDU 4055 Number String(11年大连区域赛-E题-DP)
题目链接:Click here~~题意:给一个字符串,'I' 和 'D‘ 代表排列中递增 or 递减,? 代表均可。求满足这种条件的排列的方案数。解题思路:dp[i][j] 表示长度为 i ,以 j 为结尾的排列的方案数。如果 str[i-1] == ’I‘ ,那么 dp[i][j] = dp[i-1][j-1] + dp[i-1][j-2]原创 2013-05-19 11:49:47 · 1109 阅读 · 0 评论 -
HDU 4405 Aeroplane chess(12年金华网络赛-F题-期望DP)
题目链接:Click here~~题意:有一排 n+1 个格子,编号 0~n ,有些格子可以坐飞机向前飞,飞到某个指定的格子。然后从0出发,每次掷个骰子(1~6点),然后走对应的步数,若走到有飞机的地方,则飞过去。否则,掷骰子。问走到编号为n的格子或者走到它后面的关于掷骰子次数的期望是多少。解题思路:设 P[i] 表示到达格子 i 的概率,E[i原创 2012-09-23 23:48:39 · 1119 阅读 · 0 评论 -
HDU 4293 Groups(12年成都网络赛-F题-DP)
题目链接:Click here~~题意:有 n 个人,可任意分成若干组,然后每个人各提供一个信息,表示他们组前面有多少个人,后面有多少个人。问最多有多少个信息是不冲突的。解题思路:可以把 n 个人看成一段区间 [1,n]。设每个人的信息是a、b,则这个信息代表了他们组所在的区间 S 为 [a+1,n-b]。若某些人是一组的,当且仅当他们信息所代表原创 2012-09-17 11:44:34 · 2023 阅读 · 0 评论 -
HDU 1051 Wooden Sticks(LIS)
题目链接:Click here~~题意:很经典的问题,记得是黑书上的一道思考题。模型转换完之后意思大概就是,给一个二元组,给一个偏序关系a1解题思路:首先,有个贪心的解法,不过还不会证明正确性,复杂度O(n^2)。#include #include #include #include using namespace std;co原创 2013-03-16 20:33:21 · 1033 阅读 · 0 评论 -
ZOJ 3634 Bounty hunter(DP)
题目链接:Click here~~题意:一个人带着初始的 X 元钱和 Y 的攻击力,依次经过 n 个城市从 1~n。在每个城市可以做两件事,花钱提升攻击力和用攻击力赚钱,且顺序不能改变。问最后从 n 出来时最多能有多少钱。(提升攻击力单价为 1点 / a[i] 元,但可以提升非整点的攻击力;攻击力赚钱情况为 b[i] 元 / 点)解题思路:由于攻原创 2013-07-24 09:19:14 · 2015 阅读 · 0 评论 -
ZOJ 3650 Toy Blocks(DP + 线段树优化转移)
题目链接:Click here~~题意:给出 n 个多米诺骨牌的 X 坐标以及高度 H,每次你可以选任意一张向左推或向右推,推倒后,会产生连锁反应,问最少几次能把所有的骨牌推倒。解题思路:先预处理出每张牌向 左/右 推能推到的最远位置,记为 l[i] 和 r[i]。这步可以通过递推的方法在均摊总复杂度为 O(n) 下得到。然后 dp[i][dir原创 2013-07-22 10:26:33 · 1090 阅读 · 0 评论 -
CF 280B - Maximum Xor Secondary(单调栈)
题目链接:Click here~~题意:给一个长度为 n 的序列,元素不重复,求 max {a(i) ^ a(j)} (a(i) 和 a(j) 为某个区间中的最大值和次大值,区间长度任意)。解题思路:接上篇。考虑虽然区间的个数为 O(n ^ 2) 的,但是很多区间的最大值和次大值是重复的。类似的思路,考虑 a(i) 作 为次大值时,向前能扩展原创 2013-11-30 09:54:32 · 1503 阅读 · 0 评论 -
HDU 4511 小明系列故事——女友的考验(AC自动机 + DP)
题目链接:Click here~~题意:中文题。抽象问题:给一个有向无环图,问从 1 号点到 n 号点的最短路径,路径中不能包含某些子串。解题思路:其实也不算难,如果能从“不能包含某些子串”联想到AC自动机,这题基本就解决了。令 dp[i][j] 表示到达 i 号点且位于自动机中的 j 节点所要花费的最短距离。#include #include原创 2013-12-22 10:04:31 · 2281 阅读 · 0 评论 -
HDU 2296 Ring(AC自动机 + DP 记录方案)
题目链接:Click here~~题意:给 m 个带权值的串,构造一个长度为 n 的串,使总串的权值和最大,并输出字典序最小的方案。解题思路:令 dp[i][j] 表示长度为 i ,位于自动机节点 j 所能构成的最大权值。状态和写法和上道题目类似,然后暴力记录方案。#include #include #include #include原创 2013-09-24 16:09:31 · 889 阅读 · 0 评论 -
CF 478D - Red-Green Towers(DP)
题目链接:Click here~~题意:两种颜色的方块m思路:感觉做过一道类似的题目,一看数据范围就不用想其他做法了,直接贪心策略搞吧。想来想去还是这样讲比较有说服力:先考虑颜色原创 2014-10-20 20:07:57 · 2043 阅读 · 0 评论 -
HDU 4604 Deque(LIS 转化)
题目链接:Click here~~题意:给一个序列 {An} 和一个双向队列 D,每次可以向 D 的队首或队尾插入一个元素,且 D 要保证单调不减,问如何使最后队列的长度最长。解题思路:先考虑单调递增的情况,对于 D 所能够构成的每一种序列,都可以看做以某个元素 Ax 为起始元素所形成的单增序列 Px 和单减序列 Qx 合成的。由于除了 Ax, Px 和原创 2013-07-25 11:25:39 · 988 阅读 · 0 评论 -
HDU 4778 Gems Fight!(13年杭州区域赛-I题-博弈DP)
题目链接:Click here~~题意:有 G 种颜色的宝石,放在 B 个袋子里(每种颜色可以放多个)。两人轮流选袋子(每个袋子只能被选 1 次),每次将选出来的袋子中的宝石放到 cooker 中,cooker 可能会起反应。反应条件是 cooker 中出现 S 个一样颜色的宝石,而且一旦起反应,每 S 个一样颜色的宝石就会获得 1 个魔法石(同时反应)。原创 2013-12-20 18:09:48 · 2712 阅读 · 2 评论 -
NYOJ 536 开心的mdd(区间DP)
题目链接:Click here~~月赛一道dp的题,看了看解题报告,懂了些。题意:求n个给定顺序的矩阵连乘所要的最少乘法次数。解题思路:首先我们通过观察题目中举出的例子不难发现,两个矩阵(比如(m*n) * (n*o))相乘所需要的乘法次数为:m*n*o。由于矩阵相乘是有规律的:前面的矩阵的列数等于后面的矩阵的行数。所以我们可以用一个一维数组p[n+1]巧妙将矩原创 2012-04-24 10:44:53 · 1072 阅读 · 0 评论 -
HDU 1506 Largest Rectangle in a Histogram(单调栈)
题目链接:Click here~~题意:这就是前几篇已经提到的求最大长方形那道题。解题思路:如果每次都向前向后扫描,有时会重复扫描多次,导致超时。我们可以用一个单调栈 (类似单调队列) 由低到高来存储它的高度,并用数组对每个高度记录一下它前面(包括它自己)一共有多少个比它高的,可以看做它的左宽。按顺序考虑每个高度h,如果h大于栈顶元素,则入栈,此原创 2012-07-13 09:55:32 · 5433 阅读 · 0 评论 -
HDU 2993 MAX Average Problem(斜率优化)
题目链接:Click here~~题意:给一个长度为 n 的序列,找出长度 >= k 的平均值最大的子序列。解题思路:斜率优化的例题。先存着代码。#include #include #include using namespace std;const int N = 1e5 + 5;typedef long long LL;int原创 2013-10-08 17:15:33 · 2945 阅读 · 1 评论 -
HDU 4526 威威猫系列故事——拼车记(DP)
题目链接:Click here~~题意:中文题。解题思路:题目不难,但还是错了 1 次,想了好久。。。令 dp[i][j] 表示前 i 辆车还剩 j 个人的最少花费。想到一个贪心的策略是,如果选择坐这辆车,那么肯定坐的人越多越好,因为在后面坐会增加这个人等待时间的花费。但有一个地方需要特判,就是 j = 0 时的状态不一定从 j =原创 2013-12-25 10:37:32 · 1760 阅读 · 0 评论 -
HDU 2825 Wireless Password(AC自动机 + 状态压缩DP 入门)
题目链接:Click here~~题意:给 m 个单词构成的集合,统计所有长度为 n 的串中,包含至少 k 个单词的方案数。解题思路:令 dp[i][j][mask] 表示长度为 i ,跑到自动机节点 j ,已经包含单词为集合 mask 的方案数。#include #include #include #include using names原创 2013-09-24 16:26:49 · 2820 阅读 · 0 评论 -
HDU 4534 郑厂长系列故事——新闻净化(AC自动机 + DP)
题目链接:Click here~~题意:给 n 个字符串的集合,有些字符串是要必须在主串出现,有些必须不在主串出现,其他串有分数加成。要求删除最少字符满足要求且使分数最大。解题思路:此题有两个优化目标,令 dp1[i][j][mask] 表示考虑前 i 个字符,跑到节点 j,选取必须字符串的集合为 mask 的最少删除字符数。令 dp2[i][j][mask]原创 2013-09-25 08:14:58 · 2523 阅读 · 0 评论 -
HDU 2457 DNA repair(AC自动机 + DP 入门)
题目链接:Click here~~题意:给 n 个带疾病的 DNA 串,然后给一个主串,问如何修改主串中最少个数的字符,使得主串中不包含带疾病的 DNA 串。解题思路:令 dp[i][j] 表示长度为 i,位于自动机中节点 j 的所需要修改的最少字符数。每次转移时枚举下一个可能出现的字符,判断之后会到达的节点,只要不会包含带疾病的 DNA 串就可以进行转原创 2013-09-24 15:53:54 · 2111 阅读 · 0 评论 -
HDU 4507 吉哥系列故事——恨7不成妻(数位DP)
题目链接:Click here~~题意:中文题不解释。解题思路:之前做的都是统计满足那些性质的数的 count,这次直接蹦到统计 square sum 了。。。先考虑如何统计 sum。统计 sum 维护两个值 count 和 sum 就可以了。想象状态转移时,相当于在一个具有同样性质的后缀的数的集合前面,加某个数字。那么,sum[原创 2013-12-21 17:57:23 · 3456 阅读 · 0 评论 -
NYOJ 720 项目安排(DP)
题目链接:Click here~~题意:给出 n 个区间 [a,b],每个区间有个权值 Wi,如何取不相交的区间,使权值最大。解题思路:估计是一道很经典的题目,目前学习了三种解法。1、如果区间范围比较小,例如这样。则可以用 dp[i] 表示考虑到数轴中 i 点时的最大值。存区间的时候,不再存入结构体,而是存入一个下标为起始点值的vecto原创 2013-07-23 10:57:05 · 1349 阅读 · 0 评论 -
ZOJ 3725 Painting Storages(DP解排列计数)
题目链接:Click here~~题意:n个格子排成一条直线,可以选择涂成红色或蓝色,问最少 m 个连续为红色的方案数。解题思路:应该是这次 ZOJ 月赛最水的一题,可惜还是没想到。。。dp[i] 表示前 i 个最少 m 个连续为红色的方案数。转移时,分类讨论:1、前 i-1 个已经满足这个性质,那么,第 i 个随意涂色,方案数为原创 2013-07-01 11:14:07 · 2370 阅读 · 0 评论 -
HDU 1081 To The Max(最大子矩阵和)
题目链接:Click here~~题意:RT。解题思路:想办法将二维转化成一维问题,观察矩阵和的特点我们不难发现,它将所选取的矩阵的每行每列都相加。于是我们可以枚举所有可能选取的首行和尾行,然后将其中每列的元素加到一起,存入一个数组a[ ]。然后,数组a[ ]中连续的元素就相当于一个连续的列,而首行和尾行也已经确定,所以数组a[ ]中连续元素的和原创 2012-07-11 19:40:18 · 1326 阅读 · 0 评论 -
NYOJ 110 剑客决斗(DP)
题目链接:Click here~~题意:黑书P117例题3。解题思路:考虑 x 是否能赢得战斗,把环看成链,x点拆成两个,分别作为链的起点和终点。这样,则 x 能从所有人中胜出的充要条件就是 x 能与自己“相遇”。设meet[i,j] 记录 i 和 j 能否相遇,能则为true,否则为false。(i 和 j 为上述提到的链的起点和终点)原创 2012-08-17 13:11:13 · 2055 阅读 · 0 评论 -
HDU 3033 I love sneakers!(分组背包变形)
题目链接:Click here~~题意:有n件物品被分成K组,背包容量为M,要求每组物品至少取1件,求最大价值。解题思路:由于至少取1件,所以我们要想办法标记合法状态。初始设dp[0][i]为0,其余全部为-1,-1表示非法状态。另外,要将原本分组背包中的两层循环调换下位置,否则只能将那组的一件物品放入背包。trick:数据中有费用为0的原创 2012-07-10 16:24:02 · 1373 阅读 · 0 评论 -
NYOJ 79 & 17 & 214 单调最长子序列问题(DP)
先解释下什么叫子序列。若a序列删去其中若干个元素后与b序列完全相同,则称b是a的子序列。我们假定存在一个单调序列{An}(以递增序列为例),现在在其后面添加一个元素a(n+1),有两种情况:1.a(n+1)>a(n) 。此时,a(n+1)可以添加到An序列的尾部,形成一个新的单调序列,并且此序列长度大于之前An的长度;2.a(n+1)经过分析,我们可以得出这样的结论:一个单调序原创 2012-03-03 16:48:19 · 1065 阅读 · 1 评论 -
HDU 2870 Largest Submatrix(最大完全子矩阵之不可移动列)
题目链接:Click here~~题意:和HDU 2830类似,只是这次不能再将列任意移动,于是题目完全变成了求最大长方形那道题。解题思路:只说如何求最大长方形,我的思路是枚举每个高度,然后以它做基准,向左向右扩张,扩张条件是h[i-k]>=h[k]、h[i+k]>=h[k]。记录扩张的个数即可。没想到这题竟然进rank了,好高兴。话说我都没用传说中的单原创 2012-07-12 08:28:27 · 1385 阅读 · 0 评论 -
HDU 2830 Matrix Swapping II(最大完全子矩阵之可移动列)
题目链接:Click here~~题意:给你一个矩阵,里面的数字只有0和1两种,其中,列可以任意移动。问如何移动可以使某个子矩阵中元素全部是1,求出这个最大子矩阵的面积。解题思路:枚举所有的尾行,然后对于每个尾行,记录到这行为止每列连续的1的个数,为了形象起见,我们可以把每列看做宽度为1,连续个数看做它的高度。然后问题就可以看做在一些高度可能为0的相邻矩原创 2012-07-12 08:18:43 · 1916 阅读 · 2 评论 -
HDU 1003 Max Sum(最大连续子序列和)
题目链接:Click here~~题意:RT。解题思路:比较简单的dp,很容易推出状态转移方程:sum[i] = max{sum[i-1]+a[i],a[i]}. (sum[i]记录以a[i]为子序列末端的最大连续和.)然后用一个值记录更新sum[i]的最大值即可。即对于a[i]这个数字,我们考虑是否将它选入之前连续的序列。如果选,状态变原创 2012-07-11 18:28:59 · 8314 阅读 · 0 评论 -
HDU 2546 饭卡(01背包小变形)
题目链接:Click here~~题意:中文题不解释。解题思路:由于最后5元钱可以买任何价值的物品,所以为了使余额最少,我们应该用这5元钱买最贵的物品。于是问题转化成了容量为V-5,除去一个最贵物品的01背包问题。#include #include #define N 1005#define max(a,b) a > b ? a : bi原创 2012-07-10 08:24:13 · 787 阅读 · 0 评论 -
HDU 1712 ACboy needs your help(分组背包)
题目链接:Click here~~题意:有n门课,最多学习M天。A[i][j]表示学习第 i 门课 j 天得到的价值。求如何使价值最大。解题思路:最裸分组背包。把每一天看做一组,每组中还有M件物品,只能不选或者选择其中一个物品。然后依次对每组进行01背包。一定要注意在dp时的三层循环的顺序。for(V->0)这层循环必须在for(所有属于原创 2012-07-10 10:39:37 · 629 阅读 · 0 评论 -
HDU 3496 Watch The Movie(二维01背包)
题目链接:Click here~~题意:有n个电影,每个电影有时间c和价值w两种属性,从中选m个,且必须是m个,使时间不超过T且价值最大。解题思路:挺裸的二维01背包,只是有一维要装满,标记下即可。状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c]+w).( i 表示电影个数, j 表示时间)初始时将dp[0][j原创 2012-07-09 19:29:12 · 624 阅读 · 0 评论 -
HDU 2159 FATE(二维完全背包)
题目链接:Click here~~题意:中文题不解释。解题思路:有三个变量,我们需要考虑下哪两个看做费用,哪个看做价值。习惯起见,我们把经验看做价值(因为他是状态转移时会增加的量)。状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-b[k]]+a[k]). ( i 表示杀敌数, j 表示忍耐度, a 表示增加的经验原创 2012-07-09 18:31:51 · 688 阅读 · 1 评论 -
POJ 3181 Dollar Dayz(背包求方案种数)
题目链接:Click here~~题意:有$N的钱,商店里有售价为$1,$2…$k的物品,问把N的钱花光有多少种方案。解题思路:设dp[i][j] 表示对于前 i 件物品、有 $j 的钱的时候的方案种数。则状态转移方程 dp[i][j] = sum(dp[i-1][j] , dp[i][ j-c[i] ])。初始时令dp[0][0]=1。方程很好理解,就是对原创 2012-07-09 11:00:49 · 722 阅读 · 0 评论