算法---动态规划
pengwill97
C.S Master
展开
-
【套题】牛客练习赛21
黑妹的游戏I题意黑妹最近在玩一个有趣的游戏,游戏规则是这样的: 刚开始黑板上有三个不同的初始数字,然后黑妹每一次可以选择黑板上的两个不同的数字,然后计算出这两个不同数字之差的绝对值,如果黑板上没有这个数字,那么就把这个新数字写在黑板上。 黑妹已经玩腻了这个游戏,现在黑妹想知道她最多能添加多少个数字。题解计算gcd。 如果gcd为1,那么可以制造出max(a,b,c)−3m...原创 2018-07-08 00:06:47 · 354 阅读 · 0 评论 -
UVA 437 The Tower of Babylon (DP)
题意分析状态设计dp[i][j]dp[i][j]dp[i][j]表示搭第i层方块,以j为顶的时候,最大高度。状态转移方程dp[i][k]=max(dp[i][k],dp[i−1][j]+bc[k].h)dp[i][k]=max(dp[i][k],dp[i−1][j]+bc[k].h)dp[i][k] = max(dp[i][k], dp[i-1][j] + bc[k].h)伪代...原创 2018-03-13 19:15:38 · 176 阅读 · 0 评论 -
Vijos 1431 守望者的逃离(贪心+DP)
题意分析看到题DP状态还是十分好设计的。 dp[i][j]dp[i][j]dp[i][j] 表示当前时刻iii,剩余魔法jjj 所能逃离的最大距离。 状态转移方程为: dp[i][j]=max(dp[i−1][j−4],dp[i−1][j+10]+60,dp[i−1][j]+17)dp[i][j]=max(dp[i−1][j−4],dp[i−1][j+10]+60,dp[i−1][j]+...原创 2018-03-23 11:45:06 · 299 阅读 · 0 评论 -
RQNOJ273 马棚问题(DP)
题意分析状态设计dp[i][j]dp[i][j]dp[i][j] 表示对于前i个马棚, 装前j匹马的不愉快系数的最小值。状态转移方程dp[i][j]=min(dp[i][j],dp[i−1][k]+cost[k+1][j])dp[i][j]=min(dp[i][j],dp[i−1][k]+cost[k+1][j])dp[i][j] = min(dp[i][j], dp[i-1]...原创 2018-03-18 22:59:02 · 469 阅读 · 0 评论 -
RQNOJ 166 免费午餐 (最长递增子序列 nlogn)
题意分析要用nlogn的算法 ,否则会被卡死代码总览#include<bits/stdc++.h>using namespace std;const int nmax = 100005;int a[nmax];int dp[nmax];int main(){ int n; while(scanf("%d",&n)!=EOF){ ...原创 2018-03-17 22:09:06 · 211 阅读 · 0 评论 -
洛谷P1077 摆花(DP)
题意分析状态设计 dp[i][j]dp[i][j]dp[i][j] 表示前i盆花,摆放前j种花的方案数状态转移for i: 0 to m for j: 0 to n for k: 0 to a[j] dp[i][j] += dp[i-k][j-1]注意开始循环起始值初始状态for i: 0 to a[1] dp[...原创 2018-03-11 22:18:19 · 330 阅读 · 0 评论 -
Vijos 1485 传球游戏 (DP)
题意分析状态设计: dp[i][j]dp[i][j]dp[i][j] 表示传递i次传到j位置的方案总数状态转移: dp[i][j−1]+=dp[i][j]dp[i][j−1]+=dp[i][j]dp[i][j-1] += dp[i][j] dp[i][j+1]+=dp[i][j]dp[i][j+1]+=dp[i][j]dp[i][j+1] += dp[i][j]初始状态 dp...原创 2018-03-11 22:12:32 · 264 阅读 · 0 评论 -
洛谷P1064 金明的预算方案(DP)
题意分析变形背包 对于每种商品有5种决策 不买 买主件 买主件+1号附件 买主件+2号附件 买主件+1号和2号附件 对于5种决策分别DP即可代码总览#include<bits/stdc++.h>using namespace std;const int nmax = 35000;const int mmax = 100;int mainv[mm...原创 2018-03-11 22:08:19 · 195 阅读 · 0 评论 -
POJ 1088 滑雪 (DP)
题意分析一开始用的dfs 果断超时后来想了一下,用DP是否可行 这样思考,首先从高到低给所有格子排序。由于只能从高处往地处滑,所以我就从高处向地处递推。 dp[i][j]dp[i][j]dp[i][j]就表示从格子iii行jjj列 最大第几次能访问到。 样例中数字1所在的位置就为25,即为答案所求。由于是从高向低递推,初始状态就是所有最高的地域: dp[x][y]=0dp[x][...原创 2018-03-11 21:53:41 · 228 阅读 · 0 评论 -
JoyOI1062 合并傻子(环形DP)
题意分析其实就是环形的式子合并代码总览#include<bits/stdc++.h>using namespace std;const int nmax = 255;int sum[nmax];int a[nmax];int dp[nmax][nmax],dp2[nmax][nmax];int n,m;int main(){ while(sca...原创 2018-03-15 21:58:19 · 192 阅读 · 0 评论 -
洛谷P1880 石子合并(环形石子合并 区间DP)
题意分析就是在普通的石子合并的基础上,改成环形的而已。 转移方程依旧是dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+sum[i][j])dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+sum[i][j]) dp[i][j] = max(dp[i][j], dp[i][k] +dp[k+1][j] + sum[i][j]...原创 2018-03-15 21:53:25 · 503 阅读 · 1 评论 -
JoyOI 1091 等差数列(DP)
题意分析等差数列的定义是一个数列S,它满足了(S[i]-S[i-1]) = d (i>1)。显然的一个单独的数字或者两个数字也可以形成一个等差数列。 经过一定的学习小C发现这个问题太简单了,等差数列的和不就是(Sn+S1)*n/2?因为这个问题实在是太简单了,小C不屑于去解决它。这让小C的老师愤怒了,他就找了另外一个问题来问他。 小C的老师给了他一个长度为N的数字序列,每个位置有一个...原创 2018-03-09 10:54:49 · 488 阅读 · 0 评论 -
OpenJ_Bailian - 2773 采药(DP)
题意分析裸地01背包 因为数组开小了WA了一万年代码总览#include<bits/stdc++.h>using namespace std;const int nmax = 105;int c[nmax],v[nmax];int dp[nmax][1005];int totime,m;int main(){ while(scanf("%d %d",&...原创 2018-03-08 18:33:30 · 235 阅读 · 0 评论 -
P2066 机器分配 (区间DP)
题意分析总公司拥有高效设备M台,准备分给下属的N个分公司。各分公司若获得这些设备,可以为国家提供一定的盈利。问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。其中M≤15,N≤10。分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M。区间DP状态设计dp[i][j]dp[i][j]dp[i][j] 表示前i家公司分j台机器的最大的收益值。状态...原创 2018-03-07 22:20:14 · 618 阅读 · 0 评论 -
洛谷P2196 挖地雷
题意分析仔细看题 其实就是数塔问题的变种,多了一个能否访问的条件。 所以就按照他的思路来就行了,多一个way来保存两个地点是否能够到达。关于选择的输出,用path数组保存前驱即可,代码总览#include<bits/stdc++.h>using namespace std;const int nmax = 25;int mine[nmax];int wa...原创 2018-03-13 19:23:52 · 364 阅读 · 0 评论 -
洛谷P1006 传纸条 (DP)
题意分析一开始想的是进行两遍DP,这样明显是错误的,因为会有重复走的位置,这是不符合题意的。 然后看题解,很多写的是双线程DP,我不太感觉的出来。其实想一下,因为有两个人要描述这两个人的状态,那肯定是分别用他们在平面的坐标,这是最直接的。 dp[x1][y1][x2][y2]dp[x1][y1][x2][y2]dp[x1][y1][x2][y2] 表示A走到(x1,y1)(x1,y1)(x...原创 2018-03-24 21:23:43 · 456 阅读 · 0 评论 -
【滚动训练】BZOJ.1003 [ZJOI2006]物流运输(最短路+区间DP)
题意物流公司要把一批货物从码头A运到码头B。由于货物量比较大,需要n天才能运完。货物运输过程中一般要转停好几个码头。物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪。由于各种因素的存在,有的时候某个码头会无法装卸货物。这时候就必须修改运输路线,让货物能够按时到达目的地。但是修改路线是—件十分麻烦的事情,会带来额外的成本。因此物流公司希望能够订一个n天的运输计划,使得...原创 2018-07-06 13:54:10 · 188 阅读 · 0 评论 -
【滚动训练】1270: [BeijingWc2008]雷涛的小猫(DP)
题意雷涛的小猫雷涛同学非常的有爱心,在他的宿舍里,养着一只因为受伤被救助的小猫(当然,这样的行为是违反学生宿舍管理条例的)。 在他的照顾下,小猫很快恢复了健康,并且愈发的活泼可爱了。可是有一天,雷涛下课回到寝室,却发现小猫不见了!经过一番寻找,才发现她正趴在阳台上对窗外的柿子树发呆…在北京大学的校园里,有许多柿子树,在雷涛所在的宿舍楼前,就有N棵。并且这N棵柿子树每棵的高度都是H。冬天的寒冷...原创 2018-07-09 19:07:22 · 171 阅读 · 0 评论 -
UVA1218 Perfect Service (树形dp)
题意分析状态设计dp[rt][0]dp[rt][0]dp[rt][0] 表示本节点是服务器 dp[rt][1]dp[rt][1]dp[rt][1] 表示本节点不是服务器,其父亲节点时服务器 dp[rt][2]dp[rt][2]dp[rt][2] 表示本节点不是,其父节点也不是,而其子节点有一个是服务器状态转移方程dp[rt][0]=∑min(dp[v][0],dp[v][1...原创 2018-05-23 09:52:00 · 168 阅读 · 0 评论 -
UVA12186 Another Crisis (树形dp)
题意分析对于每个儿子计算一个比例,然后依次向上合并答案 注意比例是直接下属的比例代码总览#include <bits/stdc++.h>#define rep(i, a, b) for (int i = a; i <= b; ++i)using namespace std;const int nmax = 1e6 + 10;const int INF = 0...原创 2018-05-23 09:45:52 · 183 阅读 · 0 评论 -
洛谷P2015 苹果二叉树(树形dp)
题意分析给出一个N个点的二叉树,树上有边权,求留下Q个树枝能够获得的最大收益为多少。dp[i][j]dp[i][j]dp[i][j]表示在以iii为根的节点,留下jjj个分支,的最大收益值。设uuu为当前遍历到的根节点,vvv为访问的子节点,e[i].we[i].we[i].w当前边的边权。则状态转移方程如下: dp[u][j]=max(dp[u][j],dp[u][j−k]+dp[...原创 2018-05-18 23:01:56 · 431 阅读 · 0 评论 -
Vijos1037 搭建双塔(DP)
题意分析暴力DP + bitset 优化代码总览#include<bits/stdc++.h>using namespace std;int n,s;int h[105];int main(){ scanf("%d",&n); for(int i = 1;i<=n;++i) scanf("%d",&h[i]),s+=h[i]...原创 2018-04-06 19:40:58 · 204 阅读 · 0 评论 -
Vijos1059 积木城堡(DP)
题意分析一开始我想到对于每个城堡,每块积木可以看做物品,但是思路局限n个城堡这里,没有找到突破口。 这题本质是一个01背包,但是思路十分的巧妙。 还是最初的想法,每块积木可以看做物品,那么我们就可以知道这个城堡中的积木可以得到的所有可能高度。 以此,就可以得到所有城堡可能的高度。最后找出所有可能高度中最高的那个即可。空间开销,每个城堡最高为100*100,共有100个城堡。其实可以每...原创 2018-04-06 16:09:17 · 1087 阅读 · 0 评论 -
Vijos1250 最勇敢的机器人(DP)
题意分析首先用并查集处理所有的分组,将不同分组放入不同vector中。 然后做分组背包即可,要注意分组背包的顺序for 所有分组 : 0 to g for 背包容量 : v to 0 // 必须逆序,如果写反,对于同一件物品可以无限装 for 分组物品 : 0 to item dp[j] = max(dp[j], dp[j - w[it...原创 2018-04-06 15:26:18 · 697 阅读 · 0 评论 -
Vijos1159 岳麓山上打水(迭代加深 + DP)
题意分析其实一开始写了一个假算法,看出来是完全背包了,就完全背包+记录路径,一直WA,后来看了题解才明白是迭代加深和DP。代码总览#include<bits/stdc++.h>using namespace std;const int nmax = 101;int a[nmax],ans[nmax];int dp[20001];int p,q,sum;boo...原创 2018-04-06 12:40:54 · 315 阅读 · 0 评论 -
Vijos1198 最佳课题选择(DP)
题意分析状态设计dp[i][j]表示前i个课题,分配j篇论文的最少时间状态转移dp[i][j] = min(dp[i][j], dp[i-1][k]+c[i][j-k]) 其中c[i][j-k]意为第i个课题,写j-k篇论文的时间代码总览#include<bits/stdc++.h>using namespace std;const int n...原创 2018-04-06 09:21:09 · 226 阅读 · 0 评论 -
Vijos1240 朴素的网游戏(DP)
题意分析首先要观察出题目的一个小性质,即如果有两对(或以上)夫妻住在一起的话,那么交换之后结果不会变差。因为首先这两个房间的容量至少为2,如果男男在一个房间,女女在一个房间此时花费不变,有一个房间容量大于2的时候,就还可以再入住其他人。这样结果变得更优了。 综上,要么至多存在1对夫妻住在一起,要么不存在夫妻住在一起。状态设计dp[0][i][j][k]表示没有夫妻住在一个房间,对...原创 2018-04-06 09:16:02 · 216 阅读 · 1 评论 -
基环树动态规划
基环树DP基环树定义先回忆一下普通树结构有哪些特性: 1. N个点 N-1条边。 2. 没有父节点的节点称为根节点,除根节点外每个几点都有一个父节点。基环树可以理解为: 1. 有N个点N条边 2. 在原来一颗树的基础上,添加一条边,那么就是基环树了同理,在基环树上的环中,删掉一条边,那么就是一颗普通树了。 也正是利用这个特性,在基环树上进行动态规划。基环树如何进行DP...原创 2018-03-27 22:23:24 · 911 阅读 · 0 评论 -
洛谷P1352 没有上司的舞会(DP)
题意分析树形DP入门题目。 树形DP其实和普通的DP区别就在于转移的方式。 普通的DP的状态转移是在一张表上,表的坐标表示不同的状态。而树形DP由于其特殊性,即题目中描述的关系满足树形的结构,所以利用树形结构进行状态的转移。 由于是在树上进行状态转移,所以DFS是必不可少的。对于这道题来说,关系正好是一棵树,并且可以明确的是,如果选择了父节点,那么其子节点就不能选择;如果不选择其父节...原创 2018-03-27 21:58:55 · 203 阅读 · 0 评论 -
51Nod - 1021石子归并(区间DP)
题意分析区间dp状态设计dp[i][j]表示从第i堆石子到第j堆石子的最小花费。状态转移dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+sum[i][j])dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+sum[i][j]) dp[i][j] = max(dp[i][j], dp[i][k] +dp...原创 2018-03-07 21:25:22 · 249 阅读 · 0 评论 -
UVA.12034 Race (递推)
UVA.12034 Race (递推)## 题意分析现在有nn个人比赛,可以有并列,求解有多少种排名方案。 如当n=3n = 3 的时候,可以有111,112,121,211,123,132,213,312,321,231,122,212,221 共13种方案。考虑这样一件事情,首先要确定一下出来有多少个并列第一名,有ii种方案每种方案有Cin,i∈[1,n]C^i_n, i∈[1,n] 种情况。原创 2017-09-06 23:55:00 · 244 阅读 · 0 评论 -
HDOJ(HDU).2044-2049 递推专题
HDOJ(HDU).2044-2049 递推专题点我挑战题目HDU.2044题意分析先考虑递推关系:从1到第n个格子的时候由多少种走法? 如图,当n为下方格子的时候,由于只能向右走,所以有2中走法。当n为上方格子的时候,由于只能向右走,所以也有2种走法。 不妨用a[n]来表示第n个格子有几种走法,根据上述描述,不难找出递推关系,a[n] = a[n-1] + a[n-2]。但是对于n<2的数原创 2017-02-13 20:11:22 · 320 阅读 · 0 评论 -
动态规划总结(01背包 完全背包 多重背包)
动态规划总结(01背包 完全背包 多重背包)一、学习资料1.UVA DP 入门专题 2.夜深人静写算法(二) - 动态规划 3.算法之动态规划 4.什么是动态规划?动态规划的意义是什么? 5.01背包问题和完全背包问题 6.背包九讲二、练习题目1.01背包练习 2.完全背包 多重背包练习 3.UVA的部分题目三、模型总结(1)01背包问题1.模型大意有n件商品,每件商品仅有一件,并且每原创 2017-02-20 21:13:18 · 951 阅读 · 0 评论 -
HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)
HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)题意分析先把每种硬币按照二进制拆分好,然后做01背包即可。需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数。因此用0表示不可以,1表示可以。最后对dp数组扫描一遍即可。代码总览#include <iostream>#include <cstdio>#include <cstring>#include原创 2017-02-20 18:53:58 · 316 阅读 · 0 评论 -
HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)
HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)题意分析先把每种硬币按照二进制拆分好,然后做01背包即可。需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数。因此用0表示不可以,1表示可以。最后对dp数组扫描一遍即可。代码总览#include <iostream>#include <cstdio>#include <cstring>#include <a原创 2017-02-20 18:55:07 · 394 阅读 · 0 评论 -
HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化)
HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化)题意分析首先C表示测试数据的组数,然后给出经费的金额和大米的种类。接着是每袋大米的价格,重量和袋数。 每种大米的数量是有限的,应该能看出是多重背包的问题。关键是多重背包的处理方法。对多重背包采用二进制优化的方法。设同种大米的数量为n,每袋的价格为v,那么把同一种大米分别拆成1,2,4,原创 2017-02-20 18:50:07 · 451 阅读 · 0 评论 -
HDOJ(HDU).2159 FATE (DP 带个数限制的完全背包)
HDOJ(HDU).2159 FATE (DP 带个数限制的完全背包)题意分析与普通的完全背包大同小异,区别就在于多了一个个数限制,那么在普通的完全背包的基础上,增加一维,表示个数。同时for循环多写一层即可。#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define nmax 105u原创 2017-02-20 16:55:42 · 530 阅读 · 0 评论 -
HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包)
HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包)题意分析裸完全背包代码总览#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define nmax 100005#define nn 105using namespace std;int dp[nmax];str原创 2017-02-20 16:44:23 · 273 阅读 · 0 评论 -
HDOJ(HDU).1284 钱币兑换问题 (DP 完全背包)
HDOJ(HDU).1284 钱币兑换问题 (DP 完全背包)题意分析裸的完全背包问题代码总览#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define nmax 33000#define ll long longusing namespace std;ll dp[nmax];in原创 2017-02-20 16:41:30 · 325 阅读 · 0 评论 -
HDOJ(HDU).1114 Piggy-Bank (DP 完全背包)
HDOJ(HDU).1114 Piggy-Bank (DP 完全背包)题意分析裸的完全背包代码总览#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define nmax 100000#define INF 0x3f3f3f3fusing namespace std;int we[nma原创 2017-02-20 16:37:54 · 299 阅读 · 0 评论