
动态规划—dp优化
文章平均质量分 70
My_ACM_Dream
生活没有彩排每天都是现场直播
展开
-
用一题来说明dp平行四边优化
poj 1160 题意:给出n个村庄,村庄是一条直线排好的,并且给出每个村庄到直线最左边初始点的距离。现在要建立m个邮局,于是引入一个距离S{各个村庄到最近的邮局的距离和}。那么现在问题来了如何使得这个S的值最小?题解:定义这样的方程 dp[i][j] = min{ dp[i-1][k] + w[k+1][j] } 我们可以看出这个方程满足这样的模型 s[i][j] = s[i][k] +原创 2015-01-27 09:49:27 · 758 阅读 · 0 评论 -
codeforces #264B Good Sequences (dp)
题意:给出n个元素的递增序列,求满足任意两个相邻元素不互质的最长序列长度。题解:很明显O(n^2)过不了,那么来想想有什么替他的方法,这题看了大犇的代码才懂,用的太巧妙了。首先预处理吧所有数的因子得出。然后这样dp dp[a[i]]=max{dp[a[i]的因子]+1};这样做很巧妙,无法描素看代码吧。#include#include#include#include#原创 2015-02-01 10:58:51 · 851 阅读 · 0 评论 -
zoj 3213 Beautiful Meadow(插头dp)
题意:给图地图,每个格子有分数,0分数的格子不能走。求最大分数的一条路径题解:这题异常坑爹,在换行操作、有过移位的操作中可能会误将最高位的标记为覆盖掉,因此注释的地方是改写了的,注意区别。/**积累一个小技巧,队友路径的插头dp大概分为两种大类一:只给定起点或终点、起点和终点都给定 对于这类要在总的装填转移之前加特判终点和起点的代码二:没给起点终点 这原创 2015-01-30 21:28:34 · 611 阅读 · 0 评论 -
poj 3017 Cut the Sequence(dp单调队列优化)
题意:给出n个连续的数字,现在可以将这些数分成很多段(不限制多少段),每段的最大值作为这段的价值,问如何使得总价值小。题解:看了题目一点思路都没有,果断看了神犇的博客,算法特别巧妙,感觉把队列优化用的非常娴熟。思路是这样的,对于每个位置i我定义这样的状态dp[i]表示到i位置位置价值的最小值。那么dp方程 dp[i] = min{ dp[j] , max{ a[j+1],a[j原创 2015-01-29 10:47:30 · 536 阅读 · 0 评论 -
poj 1821 Fence(dp单调队列优化)
题意:有一道线性篱笆由N个连续的木板组成。有K个工人,你要叫他们给木板涂色。每个工人有3个参数:L 表示 这个工人可以涂的最大木板数目,S表示这个工人站在哪一块木板,P表示这个工人每涂一个木板可以得到的钱。要注意的是,工人i可以选择不涂任何木板,否则,他的涂色区域必须是连续的一段,并且S[i]必须包含在内。 最后还有,每块木板只能被涂一次。题解:状态方程总共三个决策dp[i-1原创 2015-01-28 20:57:49 · 516 阅读 · 0 评论 -
hdu 2993 MAX Average Problem (dp斜率优化)
题意:给出N个正整数,求最大的,长度大于K的某一段的平均值题解:很明显的斜率优化,(sum[i]-sum[j])/(i-j)那么直接队列优化。具体看代码#include#include#include#include#include#include#includeusing namespace std;typedef __int64 lld;#de原创 2015-01-28 11:55:43 · 646 阅读 · 0 评论 -
hdu 3516 Tree Construction(四边形优化)
题意:给出n个平面上的点,要求用一棵树将所有点连起来,但是树的枝干只能往x,y的反向走。求边和最小的数。题解:挺难看出来是区间dp的,知道是区间dp就好处理了。状态方程:dp[i][j]=dp[i][k]+dp[k+1][j]+dis(i,j)-(a[i].y-a[k].y)-(a[j].x-a[k+1].x);原创 2015-01-28 11:43:01 · 664 阅读 · 0 评论 -
hdu 3506 Monkey Party(dp四边形优化)
题意:一群猴子围成圈,每个猴子互相不认识,猴王要给大家互相认识,每个猴子认识别人需要一个时间花费,而且A猴子认识B猴子,则A猴子认识的所有猴子和B猴子认识的所有猴子都能认识,这个代价为所有AB猴子认识的猴子的时间花费和。很明显的环形的区间dp和取石子问题很像。状态方程:dp[i][j]= max{ dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1] }注意一原创 2015-01-28 11:37:52 · 499 阅读 · 0 评论 -
hdu 3480 Division(dp四边形优化)
题意:给出n个数,让你把它分成m个集合,不同集合间允许有相同元素,所有集合的并集为全集,使得集合的代价和最小。单个集合的代价为集合中最大值与最小值的差值。题解:这题看过去发现序列可以任意排列,好像不能用dp,很棘手的样子,那么我们可以这样分析一下对于4个数1 4 7 9 我们分成两个集合怎么和分?如果1和7 4和9显然不能最有,1和4 7和9呢?是最优了! 那么这个例子我们看出如果将序原创 2015-01-28 11:32:39 · 673 阅读 · 0 评论 -
hdu 2829 Lawrence (dp斜率优化||四边形优化)
题意:给出很多一段路线,由n个点组成,每个点有价值,定义某个区间[i,j]上的价值为这个区间没两个点两两相乘的和,现在可以选择m个点炸掉,这样可以分成m+1段,总的价值就是每段价值的和。那么现在问题来了,如何分段使得价值对低呢?题解:这题可以用队列优化和四边形优化,首先讲下队列优化的。队列优化:方程先写出来 设dp[i][j]表示前j点,炸掉i条边的最小值。j>i状原创 2015-01-28 11:21:25 · 815 阅读 · 0 评论 -
关于dp优化的问题
dp已经是一个很优化的算法,能用很短的时间解决问题能将复杂度降到很低。但是dp也存在优化,这样使dp更加有效。 dp的优化分:单调队列优化、斜率优化、四边形优化。 我觉的单调队列优化是斜率优化的一种特殊形式。下面通过例题来了解dp的优化问题。1.斜率优化:hdu 3507 Print Article 题意:大概题意就是要输出N个数字,分成连续的多段,每一段它的费原创 2015-01-28 14:54:19 · 1056 阅读 · 0 评论 -
hdu 3530 Subsequence(dp单调队列优化)
题意:给出n个数的序列,找到这样的区间满足 m题解:用两个队列优化出处理O(nlogn)一个队列存最大值,一个队列存最小值,每次更新,满足条件的入队列,不满足条件的删除队头。#include#include#include#include#include#include#includeusing namespace std;typedef __int64原创 2015-01-28 14:52:56 · 654 阅读 · 0 评论 -
hdu 3507 Print Article(dp斜率优化)
题意:大概题意就是要输出N个数字,分成连续的多段,每一段它的费用是:这串数字和的平方加上一个常数M。题解:状态方成 dp[i] = dp[j] + M + (sum[i]-sum[j-1])^2这篇博客写的很好#include#include#include#include#include#include#includeusing namesp原创 2015-01-28 12:02:59 · 533 阅读 · 0 评论 -
hdu3401_分析降维_队列优化
这题很好,但是就是不会做,队列优化那块#include#include#include#includeusing namespace std;#define oo 0x3f3f3f3f#define maxn 2020#define maxm 2020int dp[maxn][maxm];//到第i天为止拥有的股票数为j时能赚的最大金额int ap[maxn原创 2014-11-13 11:28:16 · 797 阅读 · 0 评论 -
codeforces 264C Choosing Balls (dp)
这题各种TL,各种wa,且看大犇解析非常牛逼的将O(n^2)降到O(n)#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const int oo=0x3f3f3f3f;const ll OO=1LL<<61;const in原创 2015-02-07 12:19:39 · 647 阅读 · 0 评论