ACM-基础dp
Nicetomeetu-
没有
展开
-
POJ 3356 AGTC(算法导论15-5编辑距离) 经典dp
POJ 3356 为算法导论原题简化版,这里只讲算法导论版编辑距离。定义状态dp[i][j]表示将x[i……m]变为y[j……n]所需要的最小代价。对于每一个状态,有6种操作,具体如下。1、复制 功能:i + 1,j + 1代价:cost12、替换功能:i + 1,j + 1代价:cost23、删除功能:i + 1,j不变代价:cost34原创 2017-05-05 16:11:44 · 788 阅读 · 0 评论 -
POJ 3176 Cow Bowling 动态规划
用dp[i][j]表示从第i行第j列到最后一排所能取到的最大值状态转移方程是:dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + num[i][j];(num[i][j]表示i行j列位置的数字)记忆化搜索超时了,递归形式才63ms,第一次知道了这两者的差异。原来以为只快一点,现在看来。。。。。。代码如下:#include #i原创 2017-02-25 17:29:14 · 271 阅读 · 0 评论 -
POJ 1065 Wooden Sticks 最长上升子序列
这道题目和俄罗斯套娃差不多,我们将l 则最后的答案其实就是互相不能相互嵌套的套娃的最大数量那么怎么找这个数目呢?我们可以先按照 l 降序对套娃排序,然后在所有套娃的w中找出最长上升子序列。LIS的长度就是答案。具体的原理也很简单,最长上升子序列中的两个套娃满足 l1 >= l2 && w1 不过要注意一点,排序的时候按照 l 降序排列,如果 l 相等,就按照 w 降序排列参考这原创 2017-03-19 15:20:41 · 380 阅读 · 0 评论 -
ECNU CCCC选拔赛 E题 Teacher Panda and plagiarism dp
英语作⽂的 Online Judge 真不是什么靠谱的系统,它有的时候连⽂章是否是抄袭也分不出来。So sad!熊猫⽼师,ECNU 英语教师,对此事表⽰⾮常⽣⽓。在周⼀的英语课上,他⼤发雷霆,谈论抄袭的弊端。他甚⾄对抄袭⾏为进⾏了分类:• 相似度⼤于 20%,认定为抄袭 (COPY);• 相似度⼤于 60%,认定为剽窃 (PLAGIARISM);• 相似度为 100%,认定为「谋杀原创 2017-03-13 20:02:43 · 408 阅读 · 0 评论 -
POJ 1784/EOJ 1447 Huffman's Greed 动态规划
本题给出了关键字k1,k2....kn并且k1假如用e(i,j)表示ki,ki+1,ki+2...这几个关键字构成的最优搜索树的代价。这个状态可以怎么转移呢?现在我们有多种决策,即选择ki...kj中的哪一个作为最优搜索树的根节点。那么再来思考一个问题,当一个二叉搜索树作为一个根节点的子树使,它的代价会怎么变?显然树上每一个节点的深度都会加1,所以代价就会增加pi+...pj + qi原创 2016-10-25 14:30:53 · 935 阅读 · 0 评论 -
EOJ1765 Nested Dolls 最长上升子序列
本题我试过很多方法,最开始的思路是,一个娃娃可以套另一个娃娃,这种偏序关系可以建图。找出图中最长的路径,然后把那些点删掉,再找出最长的路径,删掉,直至图中没有点,删除的次数就是答案,可是这样会超时。第二个想法差不多,按照w+h的值递增的顺序对娃娃排序,然后用nlogn算法找出lis数组。然后利用lis数组不断的删除最长的子序列。其实和第一种思路差不多,但是还是超时。第三种就是按照w+h递减的顺序排原创 2016-10-22 16:42:53 · 1008 阅读 · 1 评论 -
(2017多校训练第五场)HDU - 6092 Rikka with Subset 0-1背包
题目链接:点击打开链接题意不再赘述。下面来讲解一下第一个样例是怎么推导出答案的。2 31 1 1 1第一个数字和最后一个数字肯定是1,不需要关注它们。下面来看第二个数字(去掉首尾之后的第一个非零数字),也就是子集和为1的数目只有一个,很容易就知道答案中有一个1。然后再看第二个非零数字,也就是子集和为2的数目只有一个,我们已经知道了答案中有一个1,如果能够求出已知的答案能原创 2017-08-09 13:12:37 · 396 阅读 · 0 评论 -
SHU OJ - 415 A序列 最长上升子序列
题目链接:A序列dp1[i]代表以第i个字符结尾的最长上升子序列的长度dp2[i]代表以第i个字符开始的最长下降子序列的长度用nlogn的算法更新这两个dp数组。最后的答案就是max(min(dp1[i], dp2[i]) * 2 - 1) (0 代码如下:#include #include #include #include #include #include原创 2017-07-12 22:19:11 · 438 阅读 · 0 评论 -
(2017多校训练第四场)HDU - 6078 Wavel Sequence dp
传送门:点击打开链接定义状态dp[i][j][0]表示以a[i],b[j]结尾的且为波谷的情况总和,dp[i][j][1] 为波峰。对于某个i,j满足a[i] == b[j],则dp[i][j][0] = sum(dp[x][y][1]), x a[i]设sum[i-1][y][1] = ∑dp[x][y][1] , x 则dp[i][j][0] = ∑sum[i-1][y]原创 2017-08-11 16:44:06 · 462 阅读 · 0 评论 -
百度之星2017资格赛 1003 度度熊与邪恶大魔王 完全背包
定义状态dp[i][j][t]代表前i种攻击,当前怪物生命值为j,防御力为t,所需要的最小代价。利用完全背包的方法很容易得到(p[i] = 第i种方法的攻击值减去防御值t)dp[i][j][t] = min(dp[i - 1][v][t], dp[i][v - p[i]] + k[i])可以写成滚动数组的形式。代码如下:#include using namespace原创 2017-08-06 20:42:01 · 365 阅读 · 0 评论 -
HDU - 6170 Two strings dp
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl原创 2017-08-23 13:37:42 · 405 阅读 · 2 评论 -
POJ 2229 Sumsets 完全背包问题
dp[n]表示n拆分的个数假如n为奇数,dp[n] = dp[n - 1]假如n为偶数1.拆分方案中有1 dp[n - 1]2.拆分方案中没有1 dp[n / 2]所以偶数情况下 dp[n] = dp[n - 1] + dp[n / 2]#include #include #include #include #include #include #include原创 2017-02-26 11:03:14 · 459 阅读 · 0 评论 -
POJ 2385 Apple Catching 动态规划
dp(i, j, k)表示处在时间i, 当前位置是j, 还有k次变换机会所能取到的最多苹果状态转移公式为dp(i, j, k) = max(dp(i + 1, !j, k - 1), dp(i + 1, j, k)) + ((j + 1) == t[i])#include #include #include #include #include #include #i原创 2017-02-26 16:10:19 · 299 阅读 · 0 评论 -
POJ 2677 (算法导论15-3)双调欧几里得旅行商问题 dp
首先按横坐标递增给所有点排序。定义状态dp[i][j]表示从点i向n走一条路L1,从点j向n走另一条路L2(如下图,两条路互不相交,并且L1在L2上面),L1 + L2的最小值。程序中用distance(i, j)表示点i到点j的距离。如何计算dp[i, j]呢?我们考虑k = max(i, j) + 1这个点,这个点肯定在L1或者L2上。k在L1上时,如下图原创 2017-05-05 16:00:40 · 932 阅读 · 1 评论 -
POJ 2184 Cow Exhibition 0-1背包
题目意思:有n头牛,每头牛有两个属性s, f。要求从中选择一些牛,使得它们的 s 值的和 ts 大于零,f 值的和 tf 大于0,并且使得 ts 加上 tf 最大。关键1:要将问题转化成0-1背包一看题目就知道这是一个取和不取 的问题,很容易想到背包。不过怎么转化呢?可以将每头牛的 s 值看成重量,f 值看成价值。定义状态 dp[i][j] 表示前 i 头牛重量和为 j 的时候能够取得最大原创 2017-04-27 23:26:03 · 281 阅读 · 0 评论 -
POJ 2392 Space Elevator 多重背包
构造最优解实际上取决于两个参数:1.当前海拔 2.能用的石块的集合同时很容易想到要按照石块的最大海拔降序排列(升序也可以)然后定义状态为前i个砖块,在当前海拔为j的情况下能够堆叠的最大高度然后便得到状态转移方程如下和多重背包化简的方式类似,有两种情况1.如果 h[i] * c[i] >= a[i] 说明在算第i个砖块的情况时, 不管当前海拔是多少,砖块的数量都足以使得海原创 2017-03-26 21:12:50 · 316 阅读 · 0 评论 -
POJ 3666 Making the Grade dp + 离散化
定义状态为前i个数字形成的以数字j结尾的单调序列的最小花费有如下状态转移方程经过化简可得可以用滚动数组实现时间复杂度是O(N*1e9)空间复杂度是O(1e9)两个复杂度都太高了。注意到n远远小于1e9,所以想到离散化。(当然我是想不到)离散化的方法就是将n个数字和1-n对应起来我们dp的时候其实是不用dp出1e9的所有数据的,我们只需要dp出原创 2017-03-20 01:29:37 · 409 阅读 · 0 评论 -
POJ 1631 Bridging signals 最长上升子序列
直线 L1 如果和 L2 不相交,那么L1的左右端点要么都小于L2,要么L1的左右端点都大于L2。因为题目给的数组已经保证了左端点递增,所以我们只需要求这个数组的最长上升子序列就行了。#include #include #include #include #include #include #define MAX_N 50005using namespace std;t原创 2017-03-19 16:12:39 · 385 阅读 · 0 评论 -
POJ 3181 Dollar Dayz 完全背包 + 高精度
定义状态为前i个金币能组合成总金额为j的方案总数状态转移方程为和完全背包类似,可以化简成因为这道题最后会爆long long int在大神的博客里面学到了一招,将答案拆成两半,用两个dp数组存。一个存高18位,一个存低18位。#include #include #include #include #include #include #define MAX_N原创 2017-03-19 11:54:52 · 437 阅读 · 0 评论 -
POJ 3046 Ant Counting dp
定义状态为前i种蚂蚁能够形成大小为j的集合的种数注意到每次都要求一段dp数字的和,我们可以使用一个前缀数组sum。由于sum数组的使用,我们可以在O(1)的时间内算出dp(i, j)同时注意到dp(i, j)只和dp(i - 1, j)有关系,所以我们可以用滚动数组来实现。最后复杂度为O(T * A)#include #include #include #原创 2017-03-19 01:02:41 · 343 阅读 · 0 评论 -
POJ 1742 多重背包问题
假设每个硬币的重量为A[i],数量是C[i] 价格是A[i]定义dp(i, j)为前i件物品装在容量为j的背包中能够取得的最大价值我们只需要求出dp(n, m)因为在求出dp(n, m)的过程中,dp(n, 1) ,dp(n, 2)......dp(n, m - 1)都已经求出来了我们就可以看dp(n, i)是否等于i来判断能否用硬币买价格为i的物品#include #in原创 2017-03-15 20:01:54 · 325 阅读 · 0 评论 -
HDU 2191 多重背包问题
状态转移方程为if (j dp(i, j) = dp(i - 1, j);elsedp(i, j) = max(dp(i - 1, j - k * w[i]) + k * v[i]) (j - k * w[i] >= 0)利用滚动数组计算,代码如下:#include #include #include #include #include #include原创 2017-03-15 17:49:05 · 275 阅读 · 0 评论 -
POJ 3616 Milking Time 动态规划
dp[i]表示从第i个区间开始,能挤的最多的牛奶动态转移方程为:dp[i] = max(dp[i + 1], dp[j] + w[i]);w[i]表示第i个区间能挤的牛奶#include #include #include #include #include #include #include #include #include #define MAX_N 1原创 2017-02-26 18:09:12 · 334 阅读 · 0 评论 -
POJ - 2762 && HDU 6165 Tarjan缩点+dp最长路
题目 POJ 2762 HDU 6165 分析 最开始想的是拓扑排序,因为拓扑序列满足如果一个点u可以到v,那么u一定在v的前面。如果求出了拓扑序列,发现序列中u在v的前面,那么就可以认为u可以到达v了。 但是随后想到两个问题如果有环的怎么办呢,就不能求拓扑序列了。虽然这个图存在拓扑序列1-2-3,但是我们能仅仅因为1在2的前面就认为1可以到2吗?显然原创 2017-08-24 11:32:09 · 574 阅读 · 0 评论