ACM——DP复习专题
文章平均质量分 85
倚剑笑紅尘
教练,我想学kaldi!
展开
-
HDU4089 Activation (概率dp)
题目链接:https://cn.vjudge.net/contest/247409#problem/D题目大意:有n个人排队等着在官网上激活游戏。Tomato排在第m个。 对于队列中的第一个人,有以下情况: 1、激活失败,留在队列中等待下一次激活(概率为p1)2、失去连接,出队列,然后排在队列的最后(概率为p2)3、激活成功,离开队列(概率为p3) 4、服务器瘫痪,服务器停止激活,...原创 2018-08-16 20:37:59 · 391 阅读 · 0 评论 -
POJ 1651 Multiplication Puzzle(区间DP)
题目链接:点击打开链接题目大意:给出n个数,a1,a2,a3..an,现在要删除中间的n-2个数,使得最后只剩下a1和an.删除的规则是,如果要删除ai,那么他需要付出的代价是ai-1*ai*ai+1,求删除的最小代价和题目思路:区间dp的思路dp[0][n-1]表示保留a0,an-1,删除中间的数的最小代价求解dp[i][j]的时候,就是枚举[i+1,j-1]中最后删除的元素。即,dp[i][j...原创 2018-04-10 22:06:05 · 148 阅读 · 0 评论 -
ZOJ 3469 Food Delivery(区间DP)
题目链接:点击打开链接题目大意:有一家快餐店送外卖,现在同时有n个家庭打进电话订购,送货员得以V-1的速度一家一家的运送,但是每一个家庭都有一个不开心的值,每分钟都会增加bi,值达到一定程度,该家庭将不会再订购外卖了,现在为了以后有更多的家庭订购,要将外卖送到的情况下使得所有用户的不开心值总和达到最小题目思路:DP的思路就是,如果要访问完[i,j],那么它的子区间一定访问完了。用dp[i][j][...原创 2018-04-10 20:57:00 · 131 阅读 · 0 评论 -
HDU 2476 String painter (区间DP)
题目链接:点击打开链接题目大意:给出两个串s1和s2,一次只能将一个区间刷一次,问最少几次能让s1=s2例如zzzzzfzzzzz,长度为11,我们就将下标看做0~10先将0~10刷一次,变成aaaaaaaaaaa1~9刷一次,abbbbbbbbba2~8:abcccccccba3~7:abcdddddcba4~6:abcdeeedcab5:abcdefedcab这样就6次,变成了s2串了第二个样...原创 2018-04-09 22:51:39 · 117 阅读 · 0 评论 -
POJ 3140 Contestants Division (删边,简单树形DP)
题目链接:题目大意:这删一条边使得剩余的两个分支 价值差最小。思路:删一个点和它父亲之间的这条边(因为父亲只有一个)。想到这里(这也不难想)就好办了,只要想办法记录每个节点 从它子树和父亲各能收获多少价值,它们的差值便是删除它和它父亲这条边的结果最后遍历一遍比较出最小差值就可以了。具体第一遍dfs,记录子树有多少节点第二遍dfs,能从父亲转移多少节点,(这里稍微注意一下 = 父亲的父亲+ 父亲的其原创 2018-01-18 18:43:46 · 280 阅读 · 0 评论 -
poj2378(树形DP)
题目链接:题目传送门题目大意:删除一个节点后,他的最大子树的结点个数小于等于一半。以升序的方式输出所有满足的结点。如果没有的话输出NONE思路:即找树的重心的算法 搜索计算每个结点子树的大小#include#include#include#include#include#includeusing namespace std;#define maxn 50000+10int n;i原创 2018-01-17 22:40:41 · 410 阅读 · 0 评论 -
poj3107 求树的重心
题目链接: 点击打开链接题目大意:给一颗n个结点的树,节点编号为1~n,问删除一个节点之后,让剩下的分支中节点数量最多的尽量少。可能有多种方案,按编号顺序输出。题目思路:树形DP问题先求他的每个子树的节点个数,n减去以该节点为根的树的节点数为他父子树的节点个数,比较取较大的那个即可。#include#include#include#define Max(a, b) a原创 2018-01-17 17:17:54 · 183 阅读 · 0 评论 -
HDU 2196 Computer (树形DP 求树上每个点能到达的最远距离)
题目链接:题目传送门题意:求树上每个点的最远距离是多少思路:对一棵树的一个结点求他的最远距离只有两种情况,要么往他的儿子结点一路走到叶子结点,要么向他的父节点往走,然后在往下一直走到叶节点,(但需要注意的时,一但你往下朝子节点走了,就不能再往父节点走了)。对于第一种情况,第一个搜索,直接回溯搜索。(从树的下部到上部得出结果)而对于第二种情况,需要用到第一种情况的数据原创 2018-01-16 23:00:09 · 1214 阅读 · 0 评论 -
HDU1520(树形dp入门题)
题目链接:题目传送门题意:在一个有根树上每个节点有一个权值,每相邻的父亲和孩子只能选择一个,问怎么选择总权值之和最大。思路: 树形dp的常规入门题:设dp[i][0]表示:当前这个点不选,dp[i][1]表示当前这个点选择的最优解。转移方程:dp[cur][0]+=max(dp[son][1],dp[son][0]);//当前这个点不选,那他的孩子可选可不选,取 最大的。原创 2018-01-16 10:21:07 · 186 阅读 · 0 评论 -
Codeforces Round #486 (Div. 3)C. Equal Sums
题目链接:点击打开链接题目大意:给出n个序列,然后求是否存在两个序列,如果他们各自减少一个数字,那么他们其余的数字和相等。题目思路:我们通过一个数组来a来记录信息,ai=(sumi,seqi,eli)其中sumi表示减去元素xi后的和,seq表述序列号,eli表示减去的元素的下标。将所有信息存储在这个数组之后,按照sum和的大小排序即可,如果存在相邻的两个ai和ai+1的sum相等,但seq序列不...原创 2018-06-23 22:57:57 · 120 阅读 · 0 评论 -
LightOJ 1422 Halloween Costumes(区间dp)
题目链接:https://vjudge.net/contest/246776#problem题目大意:给你n天分别要穿的衣服编号,可以套着穿,但是一旦脱下来就不能再穿了,(类似栈,只要弹出来了,就不能用了)问这n天最少要准备几件衣服。题目思路:dp[i][j]为第i天到第j天要穿的最少衣服,考虑第i天,如果后面的[i+1, j]天的衣服没有和第i天相同的,那么dp[i][j] = dp...原创 2018-08-14 14:16:03 · 192 阅读 · 0 评论 -
HDU 4405 Aeroplane chess (概率dp)
题目链接:https://cn.vjudge.net/contest/247409#problem/C题目大意:飞行棋游戏,格子从0到n,置骰子(6个面),置到几就往前走几步,但图中有可选的传送门,比如2到5有传送门的话,那你走到2时可以直接跳到5(也可以不跳),如果5到8也有传送门的话,那还可以继续跳到8,问从0到n的期望步数。(传送门一定是从小的点到大的点,且一个点最多为一个传送门的...原创 2018-08-16 15:08:14 · 151 阅读 · 0 评论 -
poj2096 Collecting Bugs(概率和期望DP)
题目链接:https://cn.vjudge.net/contest/247409#problem/B题目大意:一个软件有s个子系统,会产生n种bug某人一天发现一个bug,每个bug属于一个子系统,属于一个分类 每个bug属于某个子系统的概率是1/s,属于某种分类的概率是1/n求发现n种bug,且每个子系统都发现了bug的天数的期望。题目思路:f[i][j]表示现在已经找到...原创 2018-08-16 13:25:34 · 253 阅读 · 0 评论 -
hdu - 4745 - Two Rabbits(最长回文子序列)
题目链接:传送门题目大意;两只兔子,在n块围成一个环形的石头上跳跃,每块石头有一个权值ai,一只从左往右跳,一只从右往左跳,每跳一次,两只兔子所在的石头的权值都要相等,在一圈内(各自不能超过各自的起点,也不能再次回到起点)它们最多能经过多少个石头(1 <= n <= 1000, 1 <= ai <= 1000)。题目思路:两个方向跳跃,且每一步的值都相同,即求最...原创 2018-08-08 19:11:10 · 207 阅读 · 0 评论 -
【LSGDOJ 1852】青蛙的烦恼 DP
【LSGDOJ 1852】青蛙的烦恼 DP题目描述池塘中有n片荷叶恰好围成了一个凸多边形,有一只小青蛙恰好站在1号荷叶上,小青蛙想通过最短的路程遍历所有的荷叶(经过一个荷叶一次且仅一次),小青蛙可以从一片荷叶上跳到另外任意一片荷叶上。输入 第一行为整数n,荷叶的数量。接下来n行,每行两个实数,为n个多边形的顶点坐标,按照顺时针方向给出。保证不会爆double。 输出...转载 2018-08-07 16:44:03 · 422 阅读 · 0 评论 -
hdu2693(区间dp)
题目链接:传送门题目大意:详见题目题目思路:先分析题意,他说至少连续两个的等差序列,其实质是2个或3个,因为3个以上的可以化简为若干个2个或3个。其次分析,a[i],a[i+1].....a[j],如果最后一步删除了a[i]和a[j],那么中间的序列a[i+1]..a[j-1]一定已经全部删除,我们发现其中的规律为删除的为一个连续的区间。最后分析dp方程的几种情况:第一种情况:...原创 2018-08-07 15:35:39 · 182 阅读 · 0 评论 -
poj2342 Anniversary party 没有上司的舞会(树形DP基础题)
题目链接:http://poj.org/problem?id=2342题目大意:某大学举行周年会,有些人要参加,每个人都有个活跃度,但是不能让一个人和他的直接上司同时参加,已知这些人的直接上司,求最大的活跃度。解析:这些人之间的关系可以构成一棵树,本题是一个基础的树形dp。用dp[i][0]表示以当前结点为根的子树且不选择当前点的最大值,dp[i][1]表示以当前结点为根且选择当前结点的最...原创 2018-08-14 21:00:59 · 345 阅读 · 0 评论 -
poj 2152 Fire (树形DP难题)
题目链接;https://vjudge.net/contest/246776#problem/C题目大意:有n个城市,每两个城市只有一条路连接,(所以可以当成是一颗树)。现在要建设一些防火站,使每个城市都可以被覆盖。每个城市的属性是:在本城市建防火站的价钱和不在本城市建设的话,所依赖的别的防火站的最长距离。然后是n-1条路,和这条路的长度。现在问在覆盖所有城市的前提下的最少价格。题目思路:...原创 2018-08-14 17:47:39 · 326 阅读 · 0 评论 -
Codeforces Round #426 (Div. 2) D. The Bakery(DP+线段树维护)
题目链接给一个序列,要求把序列划分成k段,每一段里的权值是这一段里不同数字的个数。求如何划分使得k个区间的权值和最大。 我们容易想到dp[i][j]代表前j个分为i段时的最大值dp[i][j] = dp[i-1][k] + size(k+1 , j) ( i-1<=k<j ) //size(a,b)表示a到b这个区间里有多少个不同数字显然这是一题用线段树维护的二维d原创 2017-08-21 11:28:52 · 267 阅读 · 0 评论 -
OpenJ_POJ - 1009A Lost Widget (DP)
题意:一开始题意没理解,然后比赛时候一直没做,其实超级水,签到题。就是一个简单的背包问题。有n个物品,每个都有自己的体积,有个体积为m的被包,求第i个物品不用的话,组成体积x有多少种方法。(1思路:因为每次都只需要去掉一个,所以如果每次都是重新dp肯定会超时。所以一开始将每个物品都可以用的情况计算出来。然后后面只需要将不用的减去就可以了,不用重新计算。注意:题目原创 2017-08-19 20:22:35 · 269 阅读 · 0 评论 -
hdu 4960 Another OCD Patient(dp)2014多校训练第9场
题目链接:hdu4960题意:给出一些物体的体积,把其中一些物体合并成一个物体(体积为合并前几个物体的体积之和),使得合并后的物体的体积左右对称,即体积是回文的。分析:由于题目要求把原数列变成回文数列,所以只需要找出原数组中的关键点,然后利用这些关键点进行dp。所谓的关键点就是指数对(i,j)满足v1+v2+……+vi = vj+……+vn。因为关键点i和j是一一对应的原创 2017-08-03 23:54:21 · 231 阅读 · 0 评论 -
洛谷P2015 二叉苹果树(树形dp)
题目链接:点击打开链接题目描述有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点)这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1。我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树2 5 \ / 3 4 \ / 1现在这颗树枝条太多了,需要剪枝。但是一些原创 2017-07-23 21:32:57 · 468 阅读 · 0 评论 -
poj1738 An old Stone Game 石子合并(归并) GarsiaWachs算法
题目链接:poj1738本文转自:http://blog.csdn.net/u011328276/article/details/9669531题意: 石子合并问题, 将相邻两堆石子合并, 每次得分是合并成新的一堆石子个数, 最后累加最小值.解题思路: 1. 这类题目一开始想到是DP, 设dp[i][j]表示第i堆石子到第j堆石子合并最小得分.转载 2017-07-23 17:14:52 · 502 阅读 · 0 评论 -
hdu 3506 Monkey Party (区间dp 求环形石子合并+四边形不等式优化)
题目链接:hdu3506题目大意:求环形石子合并思路:相当于之前的直线石子合并 将前n堆石子复制到n+1到2*n,变成一个2*n长的直线石子合并问题中间我进行了四边形不等式的优化,即加入了决策w[i][j-1]#include#include#include#include#include#includeusing namespace std;#define原创 2017-07-23 15:53:20 · 1403 阅读 · 0 评论 -
hdu1059 Dividing(多重背包二进制优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1059题目大意:分别给出6种不同质量石头的数量 质量分别分1,2,3,4,5,6;问能否均分题目思路:如果用普通的多重背包 他会超时这时需要我们队多重背包进行二进制的优化转化为01背包求解:把第i种物品换成n[i]件01背包中的物品,则得到了物品数为Σn[i]的01背包问题原创 2017-07-23 14:44:35 · 245 阅读 · 0 评论 -
poj2576 Tug of War(二维费用背包)
题目链接:http://poj.org/problem?id=2576题目大意:有n个人,给出他们的体重,将他们分为两队,尽量均分,而且相差人数不能超过一个人。输出两队的体重,小的在前。思路:二维费用背包 有两个限制因素,人数和体重#include#include#includeusing namespace std;int dp[45010][120];int原创 2017-07-23 14:43:32 · 408 阅读 · 0 评论 -
POJ1837 Balance 分组背包
题目链接:http://poj.org/problem?id=1837题目大意:有一个天平两臂各挂一些钩子, 每个钩子下面可以挂一些砝码, 问在使用所有的砝码的情况下有多少种方法可以使天平平衡思路:该问题可以转化成分组背包的问题,大体如下对于每一种砝码来说我们可以关在任意一个钩子下面,这些事件是互斥的,一个砝码一个组进行分组背包即可,注意的是有负的力矩的存在, 因此我们将坐标轴移动到1原创 2017-07-23 14:42:48 · 301 阅读 · 0 评论 -
poj 2955 Brackets(区间dp)
题目链接:poj2955题目大意:给出一个字符串,进行括号的匹配。 (和),[和],两对括号,问一个字符串中最对有几个括号是互相匹配的思路:简单的区间dp问题 o(n^3)的复杂的第一层循环枚举区间的长度,第二层循环是这个区间的起始点,第三个循环是这个区间的内的间断点。#include#include#include#include#include#include原创 2017-07-23 14:40:46 · 204 阅读 · 0 评论 -
[ACM_SMU_1104]最优矩阵连乘积(区间dp)
题目链接:http://218.5.241.13:8060/oj/showProblem.jsp?pid=1104转载自:蓝飞技术部落格题目大意:求那个矩阵连乘的最小运算量思路是采用动态规划:设a[n][m]为第n个矩阵到第m个矩阵连乘的最小乘法数(n, m >= 1),b[i], b[i -1]为第i个矩阵的行数和列数(i >= 1),那么:1.a[n][转载 2017-07-23 11:47:51 · 637 阅读 · 0 评论 -
poj1463 Strategic game(树形dp)
题目链接:poj1463题目大意:一城堡的所有的道路形成一个n个节点的树,如果在一个节点上放上一个士兵,那么和这个节点相连的边就会被看守住,问把所有边看守住最少需要放多少士兵。思路:树的最小点覆盖第一步:确定状态f[x][1]以x为根的子树在x上放置的士兵的最少所需的士兵数目f[x][0]以x为根的子树x上不放置的士兵的最少所需的士兵数目第二步:确定原创 2017-07-23 22:23:20 · 234 阅读 · 0 评论 -
poj3659 Cell Phone Network(树形dp)
题目链接:poj3659题意:给你一棵无向树,问你最少用多少个点可以覆盖掉所有其他的点。(一个点被盖,它自己和与它相邻的点都算被覆盖)思路:第一步:确定状态①dp[i][0]:选点i,并且以点i为根的子树都被覆盖了。②dp[i][1]:不选点i,i被其儿子覆盖③dp[i][2]:不选点i,i没有被子节点覆盖(被其父亲覆盖)(这里其实指的原创 2017-07-24 11:08:58 · 237 阅读 · 0 评论 -
2015 CCPC D题 【0-1背包变形】
题意:有n(这题的变化就在于金条并不是完全必须放在平台上,如果是完全必须放在平台上,则题目就是一个标准的01背包问题了,但是由于首尾两端可以放出去一半的长度,就是说有两根金条的费用为w/2。其实,我们可以多开一维的数组,表示用k个两段的金条。状态转移方程:dp[i][j][k]=max(dp[i-1][j][k],dp[i-1][j-w[i]][k]+v[i原创 2017-08-03 23:44:08 · 241 阅读 · 0 评论 -
CodeForces 687C - The Values You Can Make(01背包dp)
转载自博客;http://blog.csdn.net/tiantengtt/article/details/51885106题目链接;点击打开链接题意:给定n(1 一维表示总额,二维表示能否由一维的总额得出此额度。假如枚举到的硬币面值为 t ,如果存在dp[ i - t ] [ j ] = true,那么有1、dp[ i ] [ j ] = true; 相当于原创 2017-08-03 22:38:56 · 326 阅读 · 2 评论 -
UVA - 12260 Free Goodies(dp比较难想到)
题目链接:uva12260题目大意:有n个糖果,每个糖果有p,j两个值,现在有两个人Petra和Jan,Prtra的取糖果方式是优先去p值大的j值小的;Jan取糖果的方式是尽量让自己开心值(取出糖果的j值和)大的情况下让Petra的开心值(取出糖果的p值和)也大,给出先选糖果的人,问说最后两人的开心值分别为多少。思路:因为petra的取法只需要考略当前糖果状态,而jan需要考略最终的结果,原创 2017-08-03 16:54:41 · 295 阅读 · 0 评论 -
hdu2167之状态压缩
题目链接:题目大意:给你一个矩阵,让你在矩阵中找一些元素使它们加起来和最大,但是当你使用某一个元素时,那么这个元素周围的其它八个元素都不能取!思路:当前行的状态可以由上一行推断而来,所以维护当前行和上一行即可。需要记录上一行的状态数量,每一种的状态,和从第一行到上一行每个状态的总的元素和。当前行的话通过dfs,求出当前行状态的个数以及每个状态下当前行的值。之和比较上一行和当原创 2017-08-02 23:18:26 · 273 阅读 · 0 评论 -
CodeForces - 165E(状态压缩dp)
题目链接;点击打开链接题意:数列找a&b=0 题解: 对于范围内的数1–(11.先求反 2.1—->0 is possible解释下2的意思:如果a&111==0那么a&110必定也等于0#include#include#include#include#includeusing namespace std;#define maxn 1000006int n原创 2017-08-02 19:45:56 · 429 阅读 · 0 评论 -
POJ3311:Hie with the Pie(floyd+状态压缩DP)
题目链接:题意:一个送外卖的人,要将外卖全部送去所有地点再回到店离,求最短路思路:由于不介意访问每个点的次数,所以可以先进行FLOYD求出任意两个点之间的最短路,然后就是DP。同样的,1代表有访问过,0代表没访问过。dp[s][j]代表访问状态为s的情况下最终到达点j的最优值。枚举状态s中每一个可以到达的点,从所有可能的点中枚举对其进行更新。关于状态压缩的细节方原创 2017-07-24 19:54:05 · 224 阅读 · 0 评论 -
zoj 3471 Most Powerful(状态压缩DP)
题目链接:题目大意:不超过10种气体,两两之间相互碰撞可以产生一定的能量,如a碰b,那么b气体就消失,自身不能碰自身,问最后所能得到的最大能量。思路:用10位二进制表示气体是否存在,0表示存在,1表示不存在,S(上一个状态)中的两种气体碰撞并且有一种消失,可以得到newS的状态(状态转移)状态 dp[state] 状态为state时的最大能量转移 dp[原创 2017-07-24 17:44:10 · 250 阅读 · 0 评论 -
poj 1185 炮兵阵地 (状态压缩dp )
题目链接:poj1185思路:第一步:确定状态由于每一个炮都可以打到两行,所以每一行的放置方法都与他放置的情况有关所以 f[i][j][k]表示第i行为状态j,第i -1行为状态为k时所用的最大炮兵数第二步:确定状态转移方程所以 f[i][j][p]= max(f[i][j][p], f[i -1][p][q] + num[j])q和p和原创 2017-07-24 16:19:04 · 268 阅读 · 0 评论 -
位运算入门
什么是位运算? 程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理):原创 2017-07-24 14:47:44 · 252 阅读 · 0 评论