![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
基本dp
文章平均质量分 56
林伏案
妖蛾子良多的范老爷
展开
-
poj1037
http://acm.hust.edu.cn/vjudge/problem/16370/*solution: 排列计数,dp,加参数描述dp状态。 dp[i][j][down/up]表示用i根木棒,首位选择第j短的长度,类型为down/up的排列数。 (定义第二根比第一根长的为up,反之为down)。状态转换方程如下: dp[i][j][up] = sum(dp[i原创 2016-08-15 19:54:34 · 523 阅读 · 0 评论 -
poj1390
/*solution: 区间dp,加状态参数。 如果只是用状态dp(i, j)来描述消去方块i到方块j获得的分数是无法形成递推关系的。 因为在这个时候对于最右边的大块有两种选择,一是直接消去,二是将其与左边某个大块 合并删除。而对于选择二来说,删去未必是最有方案,也许还应该与左边的某方块合并后 消去。所以只有两个参数是无法准确描述状态并形成递推关系的。解决方原创 2016-08-13 22:35:22 · 612 阅读 · 0 评论 -
uva10304(区间dp)
点击打开链接/*translation: 给一个序列即可 S = (e1,e2,...,en),且e1<e2<..<en.要把这些序列构成一个二叉搜索树。 二叉搜索树是具有递归性质的,且若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它 的右子树不空,则右子树上所有结点的值均大于它的根结点的值。 因为在实际应用中,被访问频率越高的元素,就应该越接近根节点原创 2016-09-05 16:13:10 · 335 阅读 · 0 评论 -
gcj2009R1C_C(区间dp)
/*translation: 总共有p个犯人,其中要释放q个。但是释放一个犯人必须给两排直接相邻的牢房的犯人一枚金币。 直到空牢房为止,或者监狱的两端。求q个犯人全部释放最少需要多少金币? solution: 区间dp dp[i][j]表示释放i+1~j-1的犯人需要多少金币。 dp[i][j] = 此时所需金币数量 + 释放右侧部分需要的金币 + 释放左侧部分需要的金币 no原创 2016-09-06 20:43:24 · 252 阅读 · 0 评论 -
uva1638(递推关系,dp)
/*translation: 高为1...n的杆子排成一列,从左能看到l根,从右能够看到r根。求有多少排列的可能?solution: dp,递推 为了状态的转移无后效性,按照杆子的长短从小到大来排列,先排列最短的杆子。因为这样无论这个杆子放在哪里 都对后面的转态是如何转移的无任何影响。若是最短的杆子放在最右边,则接下来的状态成了dp[n-1][l][r-1] 同理,放在最左边则是d原创 2016-10-06 17:27:11 · 313 阅读 · 0 评论 -
hdu1024(基本dp)
/*translation: 给出一串数列,求m个不相交的段最大的和是多少?solution: 基本dp。 设dp[i][j]表示前j个数划分成i段,所得到的最优解。 对于第j个数,有两种决策,一种是单独成立成一个段。另一种是和地i个段组成一段。 所以有转移方程如下:dp[i][j]=max{dp[i][j-1], max{dp[i-1][k]}} + a[i]。其中k>=1 &&原创 2016-10-29 21:56:32 · 394 阅读 · 0 评论 -
hdu1069(lis的长方体堆叠模型)
/*translation: 给出n中不同类型的石块,每种类型的石块长宽高都不一样。对于两块石块a,b。只有当a的底面的长宽严格小于b的长宽时, a才能摆放在b的上面。问最多能够将石块叠加到多高。solution: lis的长方体堆叠模型,dp 这道题很明显使用dp来做,(其实用搜索也可以吧,数据量不是很大)具体做法是先按照长宽或者宽长对各类的长方体进行排列。然后在直接套上lis的模型原创 2016-10-29 21:59:44 · 1868 阅读 · 0 评论 -
uva1632(区间dp)
/*translation: 直线上有n个点,每个点会在经过各自特定的时间后消失。问从任意位置出发走过所有的点的最短时间是多少?solution: 区间dp dp[i][j][0]表示i~j区间里的点都走完了,且最后停留在i点。 dp[i][j][1]表示i~j区间里的点都走完了,且最后停留在j点。 具体状态转移方程见代码。note: # 一开始的思路是按照TSP解决,后来发现原创 2017-01-16 17:27:52 · 347 阅读 · 0 评论 -
uva10163(两次dp)
/*translation: 见lrj紫书p306solution: 普通dp 分成两次来求解,状态的定义以及状态转移方程见代码注释note:date: 2017.1.16*/#include #include #include using namespace std;const int INF = 1e6;int dp1[105][105]; //dp1[i]原创 2017-01-16 21:10:01 · 254 阅读 · 0 评论 -
poj3233(矩阵幂)
/*translation: 给定矩阵A,求A + A^2 + ... + A^ksolution: dp,矩阵幂note: * 关键在于矩阵递推式的构造,可以先写出所有的状态递推关系,然后根据这些递推关系构造出矩阵的递推式。date: 2017.1.17*/#include #include #include using namespace std;typedef原创 2017-01-19 13:13:19 · 287 阅读 · 0 评论 -
poj3666(离散思想,lis,dp)
/*translation: 给出一列数列,问把这列数列变成非递增或者非递减的最小代价是多少。代价公式如下: |A1 - B1| + |A2 - B2| + ... + |AN - BN |。solution: dp, lis, 离散化 每个数要增加多少的量是不确定的,也就是有无穷种可能。但仔细考虑,要使得代价最少,增加后的量肯定 是原来的数列当中的数。因此先把原来数列排序。在用l原创 2016-09-16 21:45:19 · 449 阅读 · 0 评论 -
poj1631(O(nlogn的lis解法))
/*translation: 一块电路板,大致分为左右两竖排接口。现在有些接口接错了,导致线路有交错。例如左边的1接口接右2, 左2接右1,这两条线路是交错的。现在问不相交的线路最多多少条?solution: lis, dp 这道题要使线不相交,就会发现这是个lis的模型。所以按照lis求法来解就好了。但是注意要使用O(nlogn) 复杂度的解法,不然会超时。note: 关于原创 2016-09-15 21:18:43 · 508 阅读 · 0 评论 -
poj1836(基本dp)
/*solution: 基本dp,最长上升子序列。 题目要求的其实就是一个呈三角波浪分布的一个最长序列。所以基本框架就是 枚举中间的卫兵i,j。求0~i的最长上升子序列,j~n-1的最长下降子序列。 用n减去两者的和就是答案。note: 开始之所以wa的原因是认为中间两个卫兵肯定相邻,但是其实也可以不相邻。date: 2016.8.18*/#include #inclu原创 2016-08-18 22:24:13 · 262 阅读 · 0 评论 -
poj1260(形如E[j]=opt{D+w(i,j)}的dp)
/*solution: 形如:E[j]=opt{D+w(i,j)}的dp d[i]:选到种类i的时候所能花费的最少费用. 状态转移方程: d[i] = (a[i] + 10) * p[i] + d[i-1]; d[i] = min(d[i], d[j] + (sum[i] - sum[j] + 10) * p[i]);note: wa的原因是状态转移方程出错,原本思路是枚举比i小原创 2016-08-19 23:14:28 · 312 阅读 · 0 评论 -
poj2533-----E[j]=opt{D+w(i,j)} 类型板子题
最长公共子序列,做板子用:#include #include using namespace std;const int maxn = 1001;const int INF = 1e30;int a[maxn], n;int dp[maxn];int main(){ //freopen("input.txt", "r", stdin); while(~scanf原创 2016-08-19 23:44:16 · 297 阅读 · 0 评论 -
poj3267
/*solution: d[i]表示从第i个位置到最后共有多少个最少可以删去的字符。题目所求结果就是d[0] 关于状态转移方程。一开始太过与拘泥与每一步来分析。其实完全可以只考虑一些 特殊 位置。比如只考虑在给出句子中与给出字典单词的首字母相同字符的位置。这样的话, 转移方程如下: d[i] = d[i+1]+1; 在句子中所在位置的字符不是字典中任何一个单词的首字母情况 d[i]原创 2016-08-18 14:37:09 · 357 阅读 · 0 评论 -
poj1080(LCS类的转移方程)
/*translation: 题目大意是给出两个基因序列,要你求出这两个基因序列的相似度。所谓的相似度, 就是将基因串用‘-’填充使得两串长度相同后,将对应位置上的字母一一对应,再 根据题目给出的表计算出分数,由于用‘-’填充的做法有好几种,所以得分最高的那个 就作为相似度。solution: 基本dp,形如LCS的转移方程。 d[i][j]:串1选到第i-1个,串2选到第j-1原创 2016-08-20 14:49:01 · 360 阅读 · 0 评论 -
poj1065(dilworth定理+lis)
点击打开链接/*translation: n根木材长l_i重w_i,前一根木材大于后一根的话要浪费一分钟准备机器,求最省方案? solution: dp, dilworth定理, lis 此道题是求按照某一元素(长度或者重量)排序后,另一种元素最少有几个上升子序列? 这样就可以通过求另一种元素的最长下降子序列的长度,就是上升子序列的最少个数。--dilworth定理 note原创 2016-09-12 21:54:43 · 519 阅读 · 0 评论 -
poj3616(LIS)
点击打开链接/*translation: 一头奶牛每天在一些特定的时间段产奶,每次产奶之后必须休息r分钟。现在给出每天的产奶间隔和 每个间隔的产奶量,求该头奶牛的一天可以产奶最高多少? solution: LIS, dp即可解。 note: 1:一开始被给出的时间n所干扰,但是这其实是无用条件。 2:善于从题目中抽象出经典模型。 3:poj上的FJ和Bessie是真爱,t原创 2016-09-01 14:38:28 · 195 阅读 · 0 评论 -
poj3280(区间dp)
点击打开链/*translation: 给出一些字母的删除和添加的代价,求出让一串给定的字符串变成回文串的最小代价。solution: 区间dp d[i][j]:从i~j变成回文串的最小代价。具体转移方程见代码。note: 1:转移方程错误。区间dp的转移方程形式上有点类似lcs,以后可以对比lcs来写区间dp的转移方程。 2:像回文,括号这些类似的问题有时候可以考虑用区间原创 2016-09-01 16:47:15 · 229 阅读 · 0 评论 -
poj2955 (区间dp)
点击打开链接/*translation: 给定一对括号序列,要求其中已经配对的括号数量(不是对数)。solution: 区间dp d[i][j]表示i~j的最优解。 当s[i]配对s[j]时,分两大类情况。第一类是首尾两个配对,然后再加上中间的。第二类是s[i]可能与 i~j的中间某个括号k配对。此时最优解就是i~k的最优解加上k~j的最优解。 当s[i]不配对s[j]时,也原创 2016-09-01 18:02:28 · 269 阅读 · 0 评论 -
hdu1160(dp的lis模型)
/*translation: 给定一组老鼠的体重和速度,求出这样的一组老鼠数列,使得老鼠的体重在增加,速度在减少。solution: dp,lis 首先按照重量对老鼠进行排序,然后按照普通lis做法即可。note: 1.题目题意有问题,说是求sebsequence,但是按照子序列的定义来看,求出来的根本不是子序列。比如样例第9个数据组 竟然在第7个数据组之前!!而子序列的要求是原创 2017-04-02 09:59:13 · 425 阅读 · 0 评论