动态规划
Rem_Inory
这个作者很懒,什么都没留下…
展开
-
【题解】洛谷P2577 午餐(dp,排序)
https://blog.csdn.net/qq_36288976/article/details/79343492这个题解说的个人觉得是最方便理解的一个。。。将第i个人放在1号窗口:if(j>=s[i].a) f[i][j] = min(f[i][j], max(f[i-1][j-s[i].a], j+s[i].b));f[i-1][j-s[i].a]是i-1号人打饭+吃饭的...转载 2018-07-17 21:55:03 · 161 阅读 · 0 评论 -
【题解】vijos P1250 最勇敢的机器人(并查集 背包)
这道题其实是一道分组背包问题,因为将某两件物品放在一起会爆炸,并且爆炸具有传递性,所以我们可以用并查集来合并这些会爆炸的物品的编号,构成许多组,然后就可以用分组背包模板做了。fw、fp二维数组存其组号和对应的第几个箱子的大小 价值,0表示这一组里共有多少箱子。#include<cstdio>#include<iostream>using namespace std...原创 2018-07-14 21:01:16 · 197 阅读 · 0 评论 -
【题解】vijos P1198 最佳课题选择(背包)
没啥好说的。注意long long,将a*x^b记录到数组c[i][k]中,i代表第i个课题,k代表这份课题写了多少篇论文,初始化dp,求在范围内的dp最小值即可。#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#define ll long l...原创 2018-07-14 21:38:50 · 157 阅读 · 0 评论 -
【题解】vijos P1159 岳麓山上打水(迭代加深搜索 背包)
读入水桶种类后,先对其容量从小到大排序,然后从选1个水桶到选p个水桶枚举,dfs迭代搜索。dfs(i,j)表示剩下i个水桶,从j号水桶开始向下搜索(这样可以减少复杂度,迭代的思想,避免重复计算)。安排上某个水桶就给它打标记,用这个标记写dp判断现有水桶能否组合成答案。#include<cstdio>#include<iostream>#include<alg...原创 2018-07-14 21:44:18 · 210 阅读 · 0 评论 -
【题解】P1113 杂务
虽然分类在较复杂图论里,但有一种神奇的操作思想可以避免使用一切图论方法。https://www.luogu.org/blog/curtis-1020/solution-p1113如何将图论题做成dp.jpg#include<cstdio>#include<iostream>#include<cstring>#include<algori...原创 2018-07-22 22:27:41 · 230 阅读 · 0 评论 -
【题解】洛谷P1281 书的复制(dp)
https://www.luogu.org/blog/cccx2016/solution-p1281动态规划+贪心1、f[i][j]存的是前i本书分给第j个人,记录前缀和,初始化f[i][1]数组。2、三重循环更新f数组,k代表最后一个人拿第一本书的编号,前后比较最大值与之前答案最小值更新f数组。3、输出答案。使用贪心,因为要求前面的人尽量少抄写,所以我们可以记录读入数据之和来更新...原创 2018-08-10 14:15:22 · 381 阅读 · 0 评论 -
【题解】洛谷P1941 飞扬的小鸟(dp)
Flappy Kotori是很好玩的游戏对于这道题目,我的第一感觉是动态规划,但不知道应该如何实现。但实际上还是能想到的,只是要注意许多细节。我们定义二维数组dp[i][j]代表到第i列第j个位置(如原题图)需要至少多少步。记录下每一列上升下降的格数up[i],down[i]。并初始化每一列能走的上限high[i]=0,下限low[i]=m+1。读入有油管的情况,将该列的上限和下限数组更新...原创 2018-08-07 17:46:15 · 311 阅读 · 0 评论 -
【题解】洛谷P2467 地精部落(dp 滚动数组)
https://www.luogu.org/blog/user55639/solution-p2467思维难度挺大。。正解不容易想 由于原来数组两维可能比较浪费,我们注意到每次更新dp数组只需要前一位的状态,所以我们可以利用滚动数组优化。这里令偶数位存在0中,奇数位存在1中,两者之间的变化通过&1来实现,这样能节省很多时间。最后注意该方程只是考虑了开头为峰的情况,结果还应当×2才是...原创 2018-08-20 19:30:15 · 170 阅读 · 0 评论 -
【题解】洛谷P2331 最大子矩阵(dp 前缀和)
对于m=1与m=2的情况分开单独处理,m=2注意有4种不同的状态https://www.luogu.org/blog/ttt-ttt/solution-p2331#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<cstrin...原创 2018-08-20 20:57:43 · 276 阅读 · 0 评论 -
【题解】洛谷P3953 逛公园(最短路 动态规划)
NOIP2017最难的题目。。。这里给一种比较方便理解的做法。拿到这个题目,啥也不用想,首先得把最短路求出来。然而求最短路时我们要反着建图,也就是求出n到其他所有点的最短路。为什么这样做呢?因为这样可以避免正向某个点无法到达n点的情况。求出最短路后,我们可以利用动态规划解决这个问题。首先考虑没有0边的情况。我们开一个二维数组f[u][know],代表在反向图中从u到n与从u到n的最短路径之...原创 2018-08-23 17:25:12 · 290 阅读 · 0 评论 -
【题解】codevs P1403 新三国争霸(最小生成树 dp)
联动:https://blog.csdn.net/Rem_Inory/article/details/81139322这道题和一道叫物流运输的题非常相似,只不过变成了求最小生成树。根据这种思路我们求出w数组代表第i天到第j天没有灾害会消耗的军粮数,然后还要设一个判断数组记录在某一段时间内出现了灾害,记录下每一段时间内的最小值,然后进行dp操作就好了#include<cstdio&g...原创 2018-08-25 22:01:52 · 239 阅读 · 0 评论 -
【题解】vijos P1071 新年趣事之打牌
相对复杂的背包问题。首先注意是判断组成总质量-剩下牌总重量的组成。利用类似的判断背包内数字组合的方法,只不过这次不是判断能不能组合而是求组合数目,利用这个数目=0就输出0,>1就输出-1可以AC6个点。对于=1时求牌编号的情况,由于这种情况一定是唯一的,所以我们可以在求组合数目的时候就用fa数组记录下一个质量的上一个质量,用num数组记录这个质量由上一个质量推过来的编号。注意要判断编号被覆盖...原创 2018-07-13 22:46:12 · 245 阅读 · 0 评论 -
【题解】vijos P1059 积木城堡(背包)
读入数据,二维数组w存第i组城堡的第j块积木的高度(我写的时候把组数放在后面),h数组记录第i组共用了多少积木,求出最少的一组总积木的高度。初始化高度为0时dp为1,利用和之前某题类似的方法,判断这么多积木能不能搭成目标。循环判断n组内有一组dp为0就不行,否则输出答案。再否则输出0.#include<cstdio>#include<iostream>#inclu...原创 2018-07-13 22:39:37 · 408 阅读 · 0 评论 -
【题解】vijos P1037 搭建双塔(背包)
可以将该问题转化为两个01背包,然后求他们相等且和的最大值。二维数组dp[x][y]代表两座塔高度是否合理,初始化dp[0][0]=1.利用三重循环得到递推公式:若dp[x-w[i]][y]==1或dp[x][y-w[i]]==1可以推出dp[x][y]=1。从高度之和一半循环到1判断dp[i][i]==1就输出i,否则输出"Impossible"#include<cstdio>...原创 2018-07-13 22:32:12 · 244 阅读 · 0 评论 -
【题解】洛谷P1169 棋盘制作(栈,dp)
想要解决这个问题,我们不妨看一个类似的问题,就是给你n个数,代表位置n上积木的高度,求其最大面积。为了让时间复杂度控制在 O(N)之内,我们需要用栈来解决这个问题。设定h[n+1]=0来让栈最后里面的元素可以自动退栈,栈里存放高度的单调递增序列的坐标,当读入的高度比栈顶元素高度小时,那就记录下栈顶元素的高度,用当前坐标减去栈顶元素底下元素的坐标+1得到宽度,相乘记录最大值,然后将栈顶元素出栈,重复...原创 2018-07-17 20:40:21 · 197 阅读 · 0 评论 -
【题解】洛谷P2051 中国象棋(状压dp)
30分做法拿到这种题一开始肯定没有思路,而30分的数据比较小,所以我们可以暴力解决。dfs函数x代表行数,b[i]代表第i列有多少个炮了,我们知道如果某一列有两个炮,那那一行里的这一列一定不能再放炮了。分别循环表示一行里不放炮、放一个、放两个的情况,然后计算得到结果,可以解决30分。#include<cstdio>#include<iostream>#incl...原创 2018-07-17 20:30:14 · 328 阅读 · 0 评论 -
【题解】洛谷P1070 道路游戏(n^3)
原题数据范围比较诡异,最后一个点明明n^2才能过,结果n^3也过了,所以写一下这个做法吧。设一个数组dp表示一定时间内能获得收益的最大值,to[i][j]表示从第i时刻到第j时刻所获收益的最大值,可以得到状态转移方程dp[i]=max(dp[i],dp[j]+to[j][i])。对于数组to[i][j],为了求它的最优情况,我们可以通过循环来解决,由于读入时对于在m时刻获得的金币我们用一个...原创 2018-07-17 20:14:44 · 274 阅读 · 0 评论 -
【题解】 洛谷 P1156 垃圾陷阱(dp)
很明显这个题是个动态规划的问题,但我们可以用两种思路来表示dp数组。第一种:dp数组记录高度为h时,奶牛能活的最长时间。这时我们初始化dp[0]=10。设结构体读入数据,由于读入的垃圾掉落时间先后是不一定的,所以我们要个结构体按垃圾掉落时间先后排序。然后进行dp枚举第i个垃圾,此时深度为j,显然只有当dp[j]>=a[i].t,也就是在这个高度活的时间比垃圾掉落时间长的时候才能进行之后的...原创 2018-07-15 17:58:18 · 250 阅读 · 0 评论 -
【题解】洛谷 P1273 有线电视网 (树形dp)
这个题可以算是poj2486的简化版,但仍有许多细节要注意。题目让求不赔本的情况下连接最多的用户数,又是树形结构,所以我们可以联想到树形dp。设二维数组dp[n][m]代表以n结点为父亲结点,连接m个用户时的收益。由于要求dp最大值,所以我们初始dp数组[n][m]为负无穷(后面要比较赔不赔本)。利用邻接表存图,读入数据。设dfs(x,fa)表示从x节点开始,父亲节点为fa♂。为了节约时间,又...原创 2018-07-15 17:35:58 · 226 阅读 · 0 评论 -
【题解】 poj 2486 Apple Tree(树形dp)
题目大意:给你n个结点,最大步数k。接下来n个数字表示每个节点有多少个苹果,然后n-1行每行两个数,代表两个结点之间有边相连。读入多组数据,求在限定步数k内能吃到最多的苹果数。对于这道题目,由于是个树形结构,又要求限定步数内的最大值,我们可以往dp方向联想,那正解就是树形dp了。我们用邻接表存图,并设back[n][k]代表从n结点出发,走k步所能获得的最大苹果数(回到n结点)。那么答案就...原创 2018-07-15 17:20:47 · 392 阅读 · 0 评论 -
【题解】洛谷P1772 物流运输(动态规划 spfa)
对于这道题目我们可以将其分解为两个分问题来解决,首先求在任意一段时间内某些码头被禁用的情况下从1到m的最短路径,然后运用动态规划求出最小值。对于最短路径,我们可以用spfa来求。因为码头有禁用的情况,所以这里我们开一个ban[i][j]数组,代表第i号码头在第j天被禁用。time[i][j]记录在第i到第j天里从1到m的最短路径。spfa中给出要求的开始时间和末尾时间,初始化can数组代表i号...原创 2018-07-20 22:19:40 · 265 阅读 · 0 评论 -
【题解】洛谷P1005 矩阵取数(dp 高精)
2007年NOIP提高组第三题 难度还是比较大的首先来看一下题意: 题目描述帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的 n \times mn×m 的矩阵,矩阵中的每个元素 a_{i,j}ai,j 均为非负整数。游戏规则如下:每次取数时须从每行各取走一个元素,共 nn 个。经过 mm 次后取完矩阵内所有元素; 每次取走的各个元素只能是该元素所在行的行首或行尾; 每次...原创 2018-07-11 22:36:10 · 682 阅读 · 1 评论 -
【题解】洛谷P1373 小a和uim之大逃离(dp 递推)
题目背景小a和uim来到雨林中探险。突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声。刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个披头散发、青面獠牙的怪物,低沉着声音说:“呵呵,既然你们来到这,只能活下来一个!”。小a和他的小伙伴都惊呆了!题目描述瞬间,地面上出现了一个n*m的巨幅矩阵,矩阵的每个格子上有一坨0~k不等...原创 2018-07-11 22:52:00 · 204 阅读 · 0 评论 -
【题解】P1064 金明的预算方案(背包)
在解决这个问题之前,我们先把背包的相关问题的解决过一遍。对于01背包(每件物品只能用0或1次):for(int i=1;i<=n;i++) for(int j=v;j-w[i]>=0;j--) dp[j]=max(dp[j],dp[j-w[i]]+c[i]);对于完全背包(每件物品使用数目不限):for(int i=1;i<=n;i+...原创 2018-07-13 22:26:44 · 195 阅读 · 0 评论 -
【题解】洛谷P1435 回文子串(区间dp)
IOI 2000的题目 实际上是一道区间dp我们设dp[i][j]代表字符串中第i个字符到第j个字符得到回文串需要添加的字符数,初始化dp[i][i]为0。这里注意还应该初始化dp[i][i+1],如果s[i]==s[i+1]那么dp[i][i+1]=0,否则=1。接着我们枚举不相邻的两个点,如果两个字符相同那么dp[i][j]就等价于dp[i+1][j-1]。否则就等于这一段去掉首字符在尾加...原创 2018-10-04 19:46:16 · 313 阅读 · 0 评论