![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 70
sdj222555
这个作者很懒,什么都没留下…
展开
-
POJ 2063 完全背包
话说POJ这完全背包的题并不多,而且这个也不是很裸,因为股票的价格都是1000的倍数,所以价格都除以1000,整个背包的容量也除以1000, 这样复杂度就降下来了,然后每年的话,由于有收益,所以背包容量还会变化基本原理参考背包问题九讲。其核心部分与0-1背包中里面那层循环是反过来的F[0::V ] = 0for i = 1 to Nfor v = Ci to VF[v] = m原创 2011-10-24 16:44:33 · 1879 阅读 · 0 评论 -
[Usaco2008 Oct]建造栅栏 DP
勤奋的Farmer John想要建造一个四面的栅栏来关住牛们。他有一块长为n(4<=n<=2500)的木板,他想把这块本板切成4块。 这四块小木板可以是任何一个长度只要Farmer John能够把它们围成一个合理的四边形。他能够切出多少种不同的合理方案。 注意: *只要大木板的切割点不同就当成是不同的方案(像全排列那样),不要担心另外的特殊情况,go ahead。 *栅栏的面积要大于0. *输原创 2012-11-29 23:06:08 · 1367 阅读 · 0 评论 -
[Usaco2008 Nov]mixup2 混乱的奶牛 简单状压DP
混乱的奶牛 [Don Piele, 2007] Farmer John的N(4 <= N <= 16)头奶牛中的每一头都有一个唯一的编号S_i (1 <= S_i <= 25,000). 奶牛为她们的编号感到骄傲, 所以每一头奶牛都把她的编号刻在一个 金牌上, 并且把金牌挂在她们宽大的脖子上. 奶牛们对在挤奶的时候被排成一支"混乱"的队伍非常反感. 如果一个队伍里任意两头相邻的奶牛的 编号相差原创 2012-11-29 23:17:17 · 2329 阅读 · 0 评论 -
HDU 4604 Deque 二分最长上升子序列
题目大意就是给一个deque然后有n个数,依次进行操作,每种操作,你可以把这个数放在deque首部,也可以放在尾部,也可以扔掉不管,但是要保证deque中的数是非递减的。最要求deque中最长能是多少思路是这样的:对于这个序列,最重要的应该是第一个进去的数是什么,然后以该数为开头的最长不升子序列和以该数为开头的最长不降子序列则可以凑成一个最长的序列,当然这两个序列中可能都出现了该数原创 2013-08-02 21:10:32 · 2357 阅读 · 4 评论 -
POJ 3280 Cheapest Palindrome 简单DP
观察题目我们可以知道,实际上对于一个字母,你在串中删除或者添加本质上一样的,因为既然你添加是为了让其对称,说明有一个孤立的字母没有配对的,也就可以删掉,也能满足对称。故两种操作看成一种,只需要保留花费少的那个即可然后令dp[i][j]表示从位置i到j的子串转化为回文串需要的次数若 s[i]== s[j] 则dp[i][j] = dp[i + 1][j - 1]否则 dp[i原创 2013-08-25 16:58:34 · 1009 阅读 · 0 评论 -
POJ 3046 Ant Counting 简单DP
题意也比较简单了。 大概是:给出T种数字。每种各有N[i]个然后用这些数字构成一些序列, 问x长度到y长度的序列有多少种那么就是DP了dp[i][j] 表示前i种数字构成长度为j的序列有多少种然后dp[i][j] = sigma(dp[i - 1][j - k]) k的范围是0~N[i]注意到这里的sigma(dp[i - 1][j - k]) 可以用部分和原创 2013-08-28 13:05:43 · 3926 阅读 · 0 评论 -
POJ 3181 Dollar Dayz 简单DP
这DP虽然简单但是思考一下还是挺好的题意是1,2,3,4....k 用加法凑成N每个数可取不限个数令dp[i][j] 表示前i种数凑成j的方案数然后dp[i][j] = dp[i - 1][j] + dp[i - 1][j - i] + dp[i - 1][j - 2 * i]........dp[i - 1][j - k * i]这样子然后代码如下,由于结原创 2013-08-29 17:10:26 · 981 阅读 · 0 评论 -
POJ 36666 Making the Grade 简单DP
题意是:给出n个数,让你用最小的花费将其改成非递增或非递减的然后花费就是新序列与原序列各个位置的数的差的绝对值的和然后可以看到有2000个数,数的范围是10亿仔细观察可以想象到。其实改变序列中的值时,也只需要改成一个出现在原序列中的值即可也就是说新序列中的数都是在原数列中出现过的。那么我们可以将原数列离散化。dp[i][j] 表示将i位置的数改成离散化后第j个数原创 2013-08-30 16:48:32 · 981 阅读 · 0 评论 -
POJ 2184 Cow Exhibition 01背包
题意就是给出n对数每对xi, yi 的值范围是-1000到1000然后让你从中取若干对使得sum(x[k]+y[k]) 最大并且非负 且 sum(x[k]) >= 0 sum(y[k]) >= 0 其中 k为所有你取到的标号然后刚开始没什么思路后来想想。 这就是背包吧。将x看成花费,y看成价值然后dp[i]表示在花费了i情况时价值最大是多少注意到数值有原创 2013-08-30 20:48:16 · 840 阅读 · 0 评论 -
POJ 2686 Traveling by Stagecoach 壮压DP
大意是有一个人从某个城市要到另一个城市(点数然后有n个马车票,相邻的两个城市走的话要消耗掉一个马车票。花费的时间呢,是马车票上有个速率值,用边/速率就是花的时间。问最后这个人花费的最短时间是多少然后就是壮压DP了dp[S][v] 代表当前消耗了S集合的车票走到v花费的最小时间可以用spfa转移。也可以直接转移。直接转的原因是,这个图由于走路要消耗车票,所以实原创 2013-09-16 16:37:24 · 2890 阅读 · 0 评论 -
UVALive 4959 Jumping monkey
题意就是:一个猎人在森林里捕猎。然后有只猴子,喜欢躲树的后边,猎人看不见它然后给出了一张图,表示有哪些树是相邻的。数据保证任意图中两个树都可以直接或间接的到达猎人有一个枪,每次他可以选择一颗树,然后射子弹。如果猴子躲那个树后边,就被打死了。但是如果没躲那个树后边,猴子会利用猎人换子弹的时间立刻蹦到这个树相邻的树上躲藏,问猎人应该怎样击打树才能保证必然能击打中猴子原创 2013-10-06 00:43:14 · 1362 阅读 · 0 评论 -
[Usaco2008 Jan]电话网络 贪心 or 树形DP
Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流。 不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上 无线电通讯塔,来保证任意两块草地间都存在手机信号。所有的N块草地按1..N 顺次编号。 所有草地中只有N-1对是相邻的,不过对任意两块草地A和B(1 <= A <= N; 1 <= B <= N; A != B),都可以找到一个以A开原创 2013-11-06 18:03:30 · 1862 阅读 · 0 评论 -
[Usaco2007 Oct]Bessie's Secret Pasture DP
农夫约翰已经从他的牧场中取得了数不清块数的正方形草皮,草皮的边长总是整数(有时农夫约翰割草皮的刀法不合适,甚至切出了边长为0的正方形草皮),他已经把草皮放在了一个奶牛贝茜已经知道的地方。 贝茜总是希望把美味的草皮放到她的秘密庄园里,她决定从这些草皮中取出恰好4块搬到她的秘密庄园中,然后把它们分成1×1的小块,组成一个面积为N(1网上有人直接枚举过的。。n ^ 2的复杂度吧 ,也原创 2013-11-06 21:50:22 · 1539 阅读 · 0 评论 -
Codeforces 274 DIV1 C - Riding in a Lift 动态规划
题意很简单吧。原创 2014-10-25 22:42:39 · 691 阅读 · 0 评论 -
POJ 3709 K-Anonymous Sequence 斜率优化
容易得出简单的递推方程如下f[i] = min{f[j] + sum[i] - sum[j] - (i-j) *x[j+1] }然后发现复杂度太高这时可以看出是一个比较经典的斜率优化f[i] = min{f[j] +j *x[j+1] -sum[j] -i *x[j+1]} +sum[i]按照http://blog.csdn.net/sdj22原创 2014-10-20 23:31:51 · 2127 阅读 · 0 评论 -
Codeforces Round #288 (Div. 2)
A,B,C水D。有一个串,长度为n+2,现在知道他的所有n个 长度为3的子串是什么求出原始的串这题跟POJ 2337有点像最后抽象出的问题就是求欧拉通路:将每个长度为3的子串, 前两个字母(数字)看成一个结点, 后两个字母(数字)看成一个结点,然后这个子串就相当于 一条从前一个结点到后一个结点的边欧拉通路的要求就是所有边都要走一原创 2015-01-28 23:03:55 · 1195 阅读 · 0 评论 -
[Usaco2008 Mar]River Crossing渡河问题 简单DP
Farmer John以及他的N(1 <= N <= 2,500)头奶牛打算过一条河,但他们所 有的渡河工具,仅仅是一个木筏。 由于奶牛不会划船,在整个渡河过程中,FJ必须始终在木筏上。在这个基础 上,木筏上的奶牛数目每增加1,FJ把木筏划到对岸就得花更多的时间。 当FJ一个人坐在木筏上,他把木筏划到对岸需要M(1 <= M <= 1000)分钟。 当木筏搭载的奶牛数目从i-1增加到i时,FJ得多原创 2012-11-29 22:59:55 · 1598 阅读 · 0 评论 -
[Usaco2008 Oct]笨重的石子 DP
贝西喜欢棋盘游戏和角色扮演类游戏所以她说服Farmer John把她带到玩具店,在那里,她购买了三个不同的骰子,这三个质量均匀的骰子,分别有S1,S2,S3个面。(2 <= S1 <= 20; 2 <= S2 <= 20; 2 <= S3 <= 40). 贝西掷啊掷啊掷啊,想要知道出现几率最大的和是多少。 问题给出三个骰子的面数,让你求出出现几率最大的和是多少。如果有很多种和出现的几率相同,那原创 2012-11-29 22:30:25 · 1010 阅读 · 0 评论 -
[Usaco2007 Jan]Running贝茜的晨练计划
奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的 运动方式是每天进行N(1 <= N <= 10,000)分钟的晨跑。在每分钟的开始,贝茜 会选择下一分钟是用来跑步还是休息。 贝茜的体力限制了她跑步的距离。更具体地,如果贝茜选择在第i分钟内跑 步,她可以在这一分钟内跑D_i(1 <= D_i <= 1,000)米,并且她的疲劳度会增加 1。不过,无论何时贝茜的疲劳度都不能超过原创 2012-11-29 22:27:40 · 3662 阅读 · 0 评论 -
POJ 多重背包专题
POJ 1014 Dividing这道题用背包做有两种解法,一种是拆分法,另一种是很神的O(VN)的DP法。拆分法:#include #include #include #include #include #include #include #include #include #include #include #include #include #in原创 2011-10-26 21:11:20 · 1646 阅读 · 0 评论 -
几道动态规划题目
1. POJ 1080 Human Gene Functions这道题我们需要分3种情况,假设两个串分为s1, s2设dp[i][j]表示i长度的s1 和j长度的s2所匹配得的最大分值则有以下几种情况1)s1取s1[i],s2取s2[j] ,dp[i][j] = dp[i - 1][j - 1] + score(s1[i], s2[j])2)原创 2012-01-12 19:39:14 · 608 阅读 · 0 评论 -
POJ 1141 Brackets Sequence
这道题是黑书上的一个例题,不过没有给出最终输出的串,但是可以通过递归把最后的串输出首先我们定义d[i][j] 为从i位置到j位置的串匹配所需的最少步数那么当s[i] = '('&& s[j] =')' 或者s[i] = '['&&s[j] =']'时,显然d[i][j] = minI(d[i][j], d[ i + 1][ j - 1])然后当s[i]和s[j]不匹配的时候,就要对串进原创 2012-01-14 15:56:46 · 520 阅读 · 0 评论 -
USACO Section 2.3 The Longest Prefix
原来觉得挺不容易做的一题,今天一看,如此之水。用dp[i]表示前i个字符是否能由集合中的元素表示初始dp[0] = 1然后对每个位置i,枚举所有的字典中的元素,设该元素长度为j ,则把i-j 到i之间的字符串跟该元素比较,若能匹配并且dp[i - j]为1,则更新dp[i],不过貌似复杂度很高的样子2000*200000,觉得应该过不掉,结果还是过了,网上大多数人也都是用这样的3重原创 2012-01-26 18:34:37 · 714 阅读 · 0 评论 -
POJ 2411 Mondriaan's Dream 状态压缩DP
第一次看状态压缩DP啊。题目大意是给出一个 h*w 的空棋盘,1题目的数据规模很小,棋盘的每个格子有覆盖和未覆盖两种,正好对应二进制中的 1 和 0 。所以可以用一个二进制数表示一行棋盘的状态,这称之为状态压缩,然后对其进行相应的位运算,表示相应的操作。然后参考了http://www.cppblog.com/sdfond/archive/2011/03/17/91761.html原创 2012-02-05 19:40:11 · 897 阅读 · 0 评论 -
POJ 1185 炮兵阵地 状态压缩DP
http://hi.baidu.com/brabt_king/blog/item/38396a8ad00b9414c8fc7a2f.html比较好的解题报告大概如此了。不过没有提供代码。代码参考了http://www.chenyajun.com/2010/02/20/4511哎,羞愧,还是参考了才做出来的。这种先预处理可能状态,然后再枚举的思想是重要的。根据题目中的条件,每行的状态实际原创 2012-02-08 21:26:48 · 1156 阅读 · 0 评论 -
树形DP 加分二叉树 and HDU 1520 Anniversary party
题目描述设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第j个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数若某个子树为主,规定其原创 2012-02-19 15:12:38 · 1326 阅读 · 0 评论 -
BOJ 331 树形DP
这题是一个很明显的树形DP,不过修改和查询有1W次。先从不是叶子结点的位置DP一次,得到一个结果。然后每次修改某个结点的值得时候,只需要修改跟其有关的路径即可。/*ID: sdj22251PROG: inflateLANG: C++*/#include #include #include #include #include #include #include #in原创 2012-03-03 16:31:00 · 585 阅读 · 0 评论 -
COJ 1026 乘积最大 DP+高精度
这题用DP或者DFS均能过。 在COJ上看了ahyangyi大神的代码,手写了个bigint的结构体,遂模仿之,果然很好使典型的DP问题设w(h,q)表示从h位开始的q位数字组合所成的十进制数,m(i,j)表示前i位数字串插入j个乘号所得的最大乘积,初始值为:m(i,0) = w(0,q) ;动规方程如下所示:if (j==0) m(i,j) = w(0,i)原创 2012-03-08 17:36:53 · 993 阅读 · 0 评论 -
POJ 3249 拓扑排序+ 简单DP
为啥要给这个水题写个解题报告呢因为这个题太坑人了。非常简单的题意,但是数据量超级大我首先用了DFS,毫无疑问超时了然后又BFS,居然又超时了然后加上超级源点超级汇点后SPFA,各种WA后继续超时最后逼急了去写拓扑排序,瞬间就过了。 加了读入优化后能排进第一版了。其实刚开始就准备写拓扑了,但是为了试验算法,TLE和WA了好长时间,#include #in原创 2012-07-01 14:49:37 · 2007 阅读 · 0 评论 -
HDU 4374 单调队列优化 DP
这题的转移很明显。用dp[i][j] 表示到达i层j位置时的最大得分sum[i][j] 表示第i层前j个数的和dp[i][j] = max(max(dp[i - 1][j + k] + sum[i-1][j +k-1] - sum[i - 1][j - 1] + score[i][j]), max(dp[i - 1][j - k] - sum[i-1][j -k] + sum[i -原创 2012-08-16 21:50:49 · 1754 阅读 · 1 评论 -
POJ 3017 单调队列+最值优化 的动态规划
令f[i] 表示前i个数按照题目要求的最小的和则必然有f[i] = min(f[j] + max(a[j +1 , a[j + 2].....a[i])) 其中j由于a数组都是大于0的,所以可以发现f必然是非递减的。设a[j + 1], a[j + 2], ...a[i]中值最大的下标为k设x为[j + 1,k]的任意一个下标,则a[x],a[x+1],..原创 2012-09-19 16:59:11 · 4135 阅读 · 0 评论 -
vijos 1037 搭建双塔 简单DP
2001年9月11日,一场突发的灾难将纽约世界贸易中心大厦夷为平地,Mr. F曾亲眼目睹了这次灾难。为了纪念“9?11”事件,Mr. F决定自己用水晶来搭建一座双塔。 Mr. F有N块水晶,每块水晶有一个高度,他想用这N块水晶搭建两座有同样高度的塔,使他们成为一座双塔,Mr. F可以从这N块水晶中任取M(1≤M≤N)块来搭建。但是他不知道能否使两座塔有同样的高度,也不知道如果能搭建成一座原创 2012-10-23 15:41:10 · 2253 阅读 · 0 评论 -
[Usaco2008 Mar]土地购买 斜率优化的DP
农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土 地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块土地的价格是它的面积,但FJ可以同时购买多快土地. 这些土地的价格是它们最大的长乘以 它们最大的宽, 但是土地的长宽不能交换. 如果FJ买一块3x5的地和一块5x3的地,则他需要 付5原创 2012-11-27 11:38:06 · 2775 阅读 · 0 评论 -
POJ 3783 Balls 动态规划
题意:给定B (B 方法就是动态规划了。 虽然刚开始一直以为是个贪心或者构造dp[i][j] 表示有i层楼, 剩余j个球时, 最坏情况要确定K 所需的次数那么在这些楼层里我们可以选择在k层(1有两种情况,破跟不破(1)不破, 则排除掉了k层,剩余i-k层 则转化为 dp[i - k][j](2)破了 则剩余i - 1层, 球剩k - 1个 转化为 dp原创 2015-01-24 20:57:21 · 2136 阅读 · 0 评论