ACM dp问题
文章平均质量分 57
New_C_YUER
这个作者很懒,什么都没留下…
展开
-
poj 2823
<br /> 题目描述:<br /> <br /> Sliding WindowTime Limit: 12000MS Memory Limit: 65536KTotal Submissions: 16559 Accepted: 4745Case Time Limit: 5000MS<br />DescriptionAn array of size n ≤ 106 is given to you. There is a sliding window of size k which is moving原创 2011-03-18 00:31:00 · 1107 阅读 · 0 评论 -
hdu 2592
<br /> 这题实际上是一个01背包问题。开始的时候把被抓的概率作为花费乘以100、1000甚至1000000来运算,结果不是wa就是tle。。。。<br /> 后来上网看了题解,发现这是很巧妙的01背包问题。解决问题的时候是要把不被抓到的概率作为价值,而抢到原创 2011-04-11 01:11:00 · 681 阅读 · 0 评论 -
zju 1107
题目意思是给定一幅图,老鼠只能前后左右移动且最多移动k个格子(不一定在同一行或同一列,但不这样考虑也可以过。。。。),每个格子均有一定权值的食物,问从起点(0,0)开始出发的老鼠,怎么走可以获得权值最大的食物,同时要求下一个到达的格子的食物权值大于当前格子的。 和po原创 2011-07-27 17:09:16 · 623 阅读 · 0 评论 -
hdu 3507
Zero has an old printer that doesn't work well sometimes. As it is antique, he still like to use it to print articles. But it is too old to原创 2011-03-29 00:09:00 · 1737 阅读 · 0 评论 -
poj 2250
题目实际意思,就是找两篇文章中的“最多公共单词”——其实可以把它转换成最长公共子序列问题,只是这里的序列的元素不是字母而是单词罢了。 另外,此题主要是考察LCS的形成路径,因此需要一个数组记录这个路径,这里用的是二维的字符数组dir[][],其中123分别表示斜向上,向左和向上。具体原理可以看算法导论的动态规划的最长公共子序列那一篇的内容,写得非常好。 以下原创 2011-06-28 14:30:00 · 1330 阅读 · 1 评论 -
poj 1159
题目意思是最少加多少个字母,使得原字符串变成回文串。 可以用经典的LCS思想来解决此问题,因为若一个字符串,其反串和自身的LCS就等于自身的长度,那么该串必为回文串。因此,对给定字符串求反,然后求双方的LCS,所得的长度,就是不用添加字符的最长子串。那么要添加的字符数目原创 2011-06-01 13:32:00 · 592 阅读 · 0 评论 -
poj 2192
题目意思很简单,不多讲。 这题据说数据很弱,可以用暴力解,但此处我还是用了dp来做,同样是利用了LCS的思想。dp方程dp[i][j]是指第一个字符串中的第i个字符是否与第三个字符串的第j个字符串匹配(从0开始算起)。因此有dp[0][0]=1。最后对于第i个字符,分原创 2011-07-11 23:31:54 · 809 阅读 · 0 评论 -
poj 1080
题意很好懂,不多说。 此题是LCS问题的扩展,众所周知LCS求的是最长长度,而这里只是用一个搭配权值代替了长度而已,因此可以借用LCS的思想来求解。c[i][j]为两个字符串在分别在长度为i和j时所得的最长长度,由于可以首字母与‘-’相搭配,因此要有一个初始化过程(可原创 2011-07-07 22:43:43 · 580 阅读 · 0 评论 -
hdu 2993
<br /> 题目意思是求出长度大于k子序列使得其各个元素之和的平均数最大,并输出最大平均值。<br /> 这道题刚开始的时候用了单调队列来做,由于是多case,10^5的数据量,O(n)的算法一直超时。后来上网看了解题报告才知道要用到斜率优化,其思想是数形结合。具原创 2011-04-01 11:18:00 · 1855 阅读 · 0 评论 -
poj 1580
<br /> 题目意思看不懂那是不太可能的了。不过递归会tle倒有点可疑,因为discuss那里还是有人用递归过了的。<br /> 这是一道很简单的dp题,因为dp的方程已经给出并且状态转移方程也都写出了,所以根本没什么难度,就当作是认识一下dp吧,因为dp的形式有两种,一种是递推,另一种是递归,后者多用记忆化搜索来提高效率。<br /> <br /> 以下是代码:<br /> #include<cstdio><br />using namespace std;<br />const原创 2011-05-28 21:34:00 · 943 阅读 · 0 评论 -
fzu 1894
<br /> 很裸的单调队列,只要看过单调队列的人一眼就知道怎么做了。只要用单调队列来模拟一下就可以了。<br /> 这里有个对单调队列的很好的解释:<br /> 原文http://www.chenyajun.com/2011/01/24/5615<br /> <br />一个含有 n 项的数列(n <= 2000000),求出每一项前面的第 m 个数到它这个区间内的最小值。<br />用 f(i) 代表第 i 个数对应的答案, a[i] 表示第 i 个数,很容易写出状原创 2011-04-01 00:51:00 · 760 阅读 · 0 评论 -
poj 1036
<br /> 题目意思是有个伸缩门,大小在[0,k]内变动,在每个状态处,门既可以变大一个单位,也可以缩小一个单位(边界处除外),且初始时是在0处,现在有n个高贵度,身材和到来时间不尽相同的人来饭店,求怎样安排门的变化使得能够进去的人的高贵度之和最大。<br /> 经典的数塔模型的变形,用dp解,方程是dp[i][j]=max(dp[i+1][j],dp[i+1][j-1],dp[i+1][j+1]),而dp[i][j]是在第i时刻门在j大小时能够进入的最大高贵度之和。<br />此处用滚动原创 2011-05-18 23:02:00 · 1581 阅读 · 0 评论 -
poj 1651
<br /> 一看就知道是dp,再一看,才知道是矩阵链乘问题(不过刚开始时的状态方程还不是这样的,囧。。。)。在算导那里套了一下代码,外加解题报告的边界处理,水果了~<br /> <br /> 以下是代码:<br /> #include "stdio.h"<br />const int M=200;<br />const int inf=1<<29;int main()<br />{<br /> int dp[M][M],n,a[M];<br /> int i,j,k,t,l;<br />原创 2011-03-25 00:27:00 · 936 阅读 · 0 评论 -
线性 dp问题の 单调队列优化
最近开始做dp的题目了。最先从线性dp开始吧。树形dp也在很早就接触到了,不过没深入研究。最近做dp时遇到了不少比较好的题目吧,wa啊,tle啊都捡了不少。。。(淡定,是人都要挨虐的)。现在我稍微整理一下最近所做的一些比较好的线性dp题和一些好的算法,并提供一些个人想法,有不足之处就希望各位大牛指出啦~(本文将一直更新)1.斜率优化dp 其实第一次碰到这类问题时是没想过可以有这种优化方式的,建议大家去看看Winter Club 2004 周源的论文,那里系统的介绍了线性dp的一些高效原创 2011-03-28 23:59:00 · 1289 阅读 · 0 评论 -
hdu 3530
<br /> 题目意思是找出一个给出的序列的子序列,使得其中的最大与最小值的差满足一定的范围。此种线性dp一般只有O(n)的算法才可以过,因此单调队列是最好的选择。发觉对单调队列的理解还不够啊。。。写的时候还是写成了一个自创的XX队列,只是水过了sample,看来还要继续努力~~<br /> 解法就是用两个单调队列,一个维护最小值,一个维护最大值。队列里装的是下标。但队列的“平衡”(队首元素之差不在目标范围内)被打破时,就要在两条队列中的队首中将所保存的标号较小的元素出队,直到恢复平衡。然后再计原创 2011-03-25 13:35:00 · 925 阅读 · 0 评论 -
poj 3249
<br /> 乍看似乎可以用拓扑排序,但由于数据量很大,一般会超时,至少我没去用。我的做法是加一个超级出发点0,将原图的各个分量组合起来,然后进行记忆化搜索。其中 dis[i],记录的是标号为i的结点到出度为0的点的最长距离,因此dis[0]即为所求。<br /> 一开始时是用spfa()来做,一直超时,由于有负权,没敢用dijk+heap。因此,这时记忆化搜索就有用了。<br /> 以下是代码:<br /> #include<cstdio><br />#include<cstri原创 2011-05-11 00:26:00 · 699 阅读 · 0 评论 -
poj 1088
<br /> 很经典的记忆化搜索题。设状态dp[i][j]为图中第i行第j个坐标所能到达的最远距离,然后用dfs进行记忆化搜索即可。此题同时可以看成是一个二维的序列,找出其中的最长递减子序列。<br /> 以下是用记忆化搜索方法做出的代码;<br /> #include<cstdio><br />#include<cstring><br />#include<iostream><br />using namespace std;<br />const int M=110;<br />const原创 2011-05-11 00:21:00 · 480 阅读 · 0 评论 -
hdu 2844
题目意思是求出硬币的组合方案,使得硬币的总价值不超过价值m。 DP问题,可以转换成求多重背包的方案数目。直接套模板就可以了,思想可以看DD大牛的《背包九讲》一文。 #include#include#include#原创 2011-08-08 19:27:02 · 1752 阅读 · 0 评论