随笔分类 -  ACM——DP

摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4272题意:给你一个数字栈,每次必须从栈顶开始往下找距离<=5的范围内,如果存在与栈顶相同的数字,则两个数字同时出栈,其余数字还在栈中保持相对位置不变。思路:比赛时,这道题目相当坑爹,才开始写的是<5 VON想到贪心模拟,可是我出了两组数据一组数据按最近贪不对,另一组按最远贪也不对。于是我们纠结啊。。。。后来知道题目出错,是<=5于是贪心水过。后来才发现贪心是不对的这组数据:121 2 2 1 3 1 1 1 1 1 1 3应该输出0可是输出1也对。。我对这题无语了。。。我处理成<=7 阅读全文
posted @ 2012-09-14 17:09 E_star 阅读(369) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4283题意:给定一个长度为n的序列表示人,每个人都有一个愤怒系数与之对应。他们依次上台,当第k个人上台时,他的愤怒值为(k - 1)*Di. 给定一个小黑屋相当于栈,来调整上台顺序使总的愤怒值最小思路:区间DP dp[i][j]表示第i个人到第j个人区间上台愤怒值的最小值。对于区间[x][y]如果x在第i个位置上台,则有x + 1,x + 2,.....,x+i,x ,x + i + 1.....y则将整个区间分为[x+ 1][x+i]和[x+i+1][y]两个小区间这样局部最优的思想就出来了。dp[x][y 阅读全文
posted @ 2012-09-12 14:56 E_star 阅读(206) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4284题解:http://www.cnblogs.com/E-star/archive/2012/09/11/2680992.htmlView Code #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <set 阅读全文
posted @ 2012-09-11 23:19 E_star 阅读(189) 评论(0) 推荐(0)
摘要:hdu 2993MAX Average Problemhttp://acm.hdu.edu.cn/showproblem.php?pid=2993这题都整死我了,代码基本上和别人AC的都快一样了还是不对。郁闷死了快。。最后终于发现了错误点自判断斜率时y1*x2 <= y2*x1 如果用整型就会超数据类型肯定会错,而上边的用整型可以过,不过最好用实型因为毕竟k的大小不确定。。。这题的详细解释http://www.docin.com/p-47950655.html例2 这里在转到0-n个点求斜率的时候不好理解。数形结合以形住树。View Code #include <iostream& 阅读全文
posted @ 2012-08-28 11:34 E_star 阅读(307) 评论(0) 推荐(0)
摘要:做了几道前几天多校的单调队列优化DP题目:hdu 4326Dragon Ballhttp://acm.hdu.edu.cn/showproblem.php?pid=4362题意:Sean的到一个地图上边标有什么时刻什么地点会出现龙珠,龙珠在每一时刻出现在同一行里,Sean每一时刻只能去一个龙珠,给出他取龙珠所消耗的能量以及移动所消耗的能量。求他在每个时间段取龙珠的最小能量消耗;思路:dp[i][j]表示在i时间取第j个龙珠的最小能量消耗则有dp[i][j] = min(dp[i - 1][k],abs(p[i - 1][k].pos - p[i][j].pos)) + p[i][j].w;此方 阅读全文
posted @ 2012-08-27 08:54 E_star 阅读(538) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2057题意:蜗牛的房子遗失在了一棵树的某个叶子结点上,它要从根结点出发开始寻找它的房子。有一些中间结点可能会住着一些虫子,这些虫子会告诉蜗牛它的房子是否在以这个中间结点为根的子树上,这样蜗牛就不用白跑路了。当然,如果有些结点没有住着虫子的话,那么可怜的蜗牛只有靠自己决定访问顺序来探索了。假设蜗牛走过一条边的耗费都是1,且房子遗失在每个叶子结点的概率都是相等的,那么请问蜗牛找到他的房子的最小数学期望值?思路:http://blog.sina.com.cn/s/blog_5f5353cc0100hd08.html (觉得这里讲的比较清楚)Vie 阅读全文
posted @ 2012-08-14 11:36 E_star 阅读(218) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1185题意:给出一个n*m的矩阵,矩阵的每个方格标有P/H p表示可以安置大炮,H表示不能安置大炮,当大炮安置于(i,j)点时,其左右两个单位以及上下两个单位都在攻击范围,求在两支大炮不会相互攻击的前提下,最多能够安置大炮的数量。思路:当前行大炮的的安置要受其前两行的影响,所以状态转移方程有:dp[i][j][k] = max(dp[i][j][k],dp[i - 1][k][l] + sum[j]) dp[i][j][k]表示第i行的状态为j第i - 1的状态为k sum[j]表示该行取j状态时可能增加的数量;View Code #i.. 阅读全文
posted @ 2012-08-13 21:03 E_star 阅读(236) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=3254题意:给定一个n*m的矩形,fj要在里面种玉米给奶牛吃,矩形内的小格中如果为1说明土地肥沃可以种植,如果为0说明土壤贫瘠不能种植玉米,而且奶牛们不喜欢在挨着的田地里吃玉米,问fj有多少种可选择方案种植玉米。思路:表示对状态dp不来感啊,首先dp[i][j]表示第i行在第j中状态下的可能数,则有dp[i][j] += dp[i - 1][k]这里k是在第i - 1行的所有状态中满足要求的状态。j也是在第i行满足要求的状态。j,k满足要求的条件:1:满足当前行本身的种植条件;2:与上一行的种植情况要满足要求;View Code #incl 阅读全文
posted @ 2012-08-13 17:33 E_star 阅读(195) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1925题意:蜘蛛侠的女朋友被坏人抓到了tower (目标点),他必须尽快从apartment(起点)到tower去救人,给出n个建筑物的坐标以及高度(第一个为起点最后一个为目标点),求蜘蛛侠用蜘蛛网最少荡几次才能到达tower?注意:这里在起点之后的建筑物保证高度都会大于等于起点的高度。思路:首先计算每个点i的来源点j的取值范围,然后枚举这个范围,递归的求解。假设来源点为j 则有x[i] - sqrt(h[i]*h[i] - (h[i] - H)*(h[i] - H)) <= j < x[i]; 其中x[i]为i建筑物的坐标,h 阅读全文
posted @ 2012-08-13 14:25 E_star 阅读(246) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2948题意:给你一个n*m的矩形方格,每个方格里面都存有一定的矿资源,要求我们在每个方格内建立传送带,将他们传送到指定的工厂,一定有两种资源一种是yeyenum ,规定这种资源只能用自东向西传送带传送到最西边的工厂否则这些资源就会丢失,第二种为bloggium,规定只能用自南向北的传送带传送到最北边的工厂生产否则这种资源也会丢失。为如何开采后传送资源使获得的资源数最多,并输出最多的开采量。思路:对于每一个点来说,他要么一直传送到最北边的工厂,要么传送到最西边的工厂,所以对于每一点有两种传送方式,故有状态转移方程为:dp[i][j] = ma 阅读全文
posted @ 2012-08-13 09:07 E_star 阅读(276) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2029二维树状数组解法:http://www.cnblogs.com/E-star/archive/2012/07/30/2615239.html题意:给定一个W*H的矩形方格,然后给出n个柿子树所在矩形小方格的坐标,然后给你一个dx*dy的小矩形,求用此小矩形能够框住的最多的柿子树的个数;思路:dp[i][j] 存储从[0,0]到[i,j]的和,然后暴力枚举即可:View Code #include <cstdio>#include <iostream>#include <cstring>#includ 阅读全文
posted @ 2012-08-12 19:51 E_star 阅读(169) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=3280题意:给定一个长度为m的字符串(都是小写字母) ,求通过添加或者删减若干个字符是原字符串变为回文串的最小代价(这里给出n个字符的删除与添加所需的代价,规定添加和删除的字符串都在给定的这n个字符中);思路:只能说自己dp太弱了,以后有时间一定要多练习dp。这里对字符串从两端开始进行比较如果相同则dp[i][j] = dp[i + 1][j - 1],如果不同则dp[i][j] = min(dp[i + 1][j] + min(addv[str[i] -'a'],delv[str[i] - 'a']),dp 阅读全文
posted @ 2012-08-12 16:54 E_star 阅读(176) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1191题意:中文省略.思路:黑说p116有讲解,主要的状态转移方程为横着切:dp[k][x1][y1][x2][y2] = min(dp[k - 1][x1][y1][mid][y2] + dp[1][mid][y1][x2][y2],dp[k - 1][mid][y1][x2][y2] + dp[1][x1][y1][mid][y2]); x1 + 1 <= mid < x2竖着切:dp[k][x1][y1][x2][y2] = min(dp[k - 1][x1][y1][x2][mid] + dp[1][x1][mid][x 阅读全文
posted @ 2012-08-12 09:55 E_star 阅读(250) 评论(0) 推荐(0)
摘要:DFS解法:http://www.cnblogs.com/E-star/archive/2012/08/11/2633842.htmlhttp://poj.org/problem?id=1691题意:给定一个大矩形,然后给出n个需要染色的小矩形的左上角的坐标,右下角的坐标以及该矩形要染得颜色,每个颜色对应的一把刷子。问将这些小矩形染完规定的颜色之后需要最少的刷子数。要求:只当该小矩形的上边的矩形都染完色之后,该矩形才能染色,如果同一个刷子被使用多次也要计算进来;View Code #include <cstdio>#include <cstring>#include & 阅读全文
posted @ 2012-08-11 21:07 E_star 阅读(271) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1699DFS+剪枝解法http://www.cnblogs.com/E-star/archive/2012/08/10/2631584.html题意:现在给出几个基因片段,要求你将它们排列成一个最短的序列,序列中使用了所有的基因片段,而且不能翻转基因。,这些基因可以重叠,只要一个基因的后段和一个基因的前端一样,就可以将其重叠链接在一起。现问将这些 基因全部排列出来,最短的长度为多少。思路:将n个基因片段的所有状态压缩,dp[i][j]表示状态i以j基因片段结尾的最短长度,则有dp[i][j] = min(dp[i][j],dp[tmp][k 阅读全文
posted @ 2012-08-10 18:14 E_star 阅读(200) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=3661奶牛在N分钟内锻炼,在每一分钟他可以选择跑步或者休息,每跑一分钟疲劳度加1,每休息一份中疲劳度减1。休息时必须等到疲劳度为0才能继续跑,每分钟所能跑的距离为Di,在跑的过程中疲劳度不能超过m,求奶牛可以跑得最长距离;dp的题目,拿过来果断的想不出状态转移方程啊,对dp的感觉还是这么弱,以后要加强锻炼。一共有n个点,有限制m,这不是很典型的二维dp码?dp[i][j] 表示在i分钟时疲劳度为j所能跑得最远距离则有状态转移方程:如果选择跑步:dp[i][j] = dp[i - 1][j - 1] + val[i] (1<= j &l 阅读全文
posted @ 2012-05-06 10:14 E_star 阅读(208) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1159给定一字符串,问最少插入多少字符能使该字符串变成回文串。只要求出该字符串与其逆串的公共子序列,然后然后用n减去就得结果。这里卡内存,可以将f[5007][5007]定义成short int 型,计算后能险过,所以这里最好采用滚动数组。View Code #include <cstdio>#include <cstring>#include <iostream>#define maxn 5005using namespace std;char s[maxn];int f[2][maxn];int ma 阅读全文
posted @ 2012-04-30 15:17 E_star 阅读(136) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1080discuss 里面的解释已经很经典很明白了。http://poj.org/showmessage?message_id=74842View Code #include <cstdio>#include <cstring>#include <iostream>#define maxn 107using namespace std;int f[5][5] ={ {5,-1,-2,-1,-3}, {-1,5,-3,-2,-4}, {-2,-3,5,-2,-2}, {-1,-2,-2,5,-1}, {-3 阅读全文
posted @ 2012-04-30 10:36 E_star 阅读(138) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1836其实前不久校赛的题目就是这个题目的一个简化版本,http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2403这道题只要求出从左到右,从右到左,以及Ak1<Ak2<Ak3<...<Amid-1<Amid>Amid+1>...>Akm-2>Akm-1>Akm (k1,k2,k3....km均在1到n之间) 严格按照左边递增右边递减的序列长度去最大就好了。这里的题意和SDUT2403差 阅读全文
posted @ 2012-04-29 15:57 E_star 阅读(214) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1260题意是:给定不同级别不同价值的珍珠,问如果购买所有的珍珠最少花费。每买一种价格的珍珠就要多付10个钱。其中低等的珍珠可以用高等的珍珠进行替代才开始自己想的是对于当前等级i的珍珠要么只买这一等级的珍珠,要么用这一等级的珍珠替换所有比他低级的珍珠以求得购当前(a[1]+a[2]+a[3] +....+a[i])数量珍珠的最少费用,样例过了可是WA后来想了想对于当前状态比他低级的不应定非要用它替换,我们只要最小就可以了,如果这要对于i后面的状态(情况特别多)就不好处理了。最后看了一下discuss有人证明了,只要枚举比i低级的连续的等级用i 阅读全文
posted @ 2012-04-29 13:26 E_star 阅读(225) 评论(0) 推荐(0)