动态规划
文章平均质量分 72
ccDLlyy
不忘初心,方得始终
展开
-
CodeForces 859C Pie Rules(DP + 思维)
题目链接:点击打开链接题意:两个人Bob和Alice分面包,各种大小的面包顺序是固定的,拿到令牌的一方对当前面包的归属有决定权(可以给自己;也可以不给自己),同时令牌要交给没得到面包的一方(对于当前拿到令牌的人,有两种情况:面包给对方,令牌继续保留;面包给自己,令牌交给对方)。开始令牌在Bob手中,俩人足够聪明,问最后Alice和Bob各自得到多少面包?思路:很多特征都使问题像是个博弈,但原创 2018-02-06 00:04:18 · 455 阅读 · 0 评论 -
2017百度之星资格赛 1004 度度熊的午饭时光(01背包)
题目链接:点击打开链接题意就是 用尽可能多的钱(在预算内),买 得分和 尽可能高的饭(不重样),同时饭的 序号和 尽可能小,序号和一样小的取 字典序 小的方案。用01背包做的,dp[i][j]表示前i个菜品中,花费j元所能购买(正好购买!!!j不能有剩余)的菜品的最高得分和,因为题目有序号和打印具体选择的要求,引入sum[i][j],pre[i][j],sum[i][j]表示在满足最高得分原创 2017-08-07 00:27:45 · 560 阅读 · 0 评论 -
2017百度之星资格赛 1003 度度熊与邪恶大魔王(DP)
题目链接:点击打开链接题目中文,容易理解,不再叙述思路:开始想到的是完全背包,对于每个怪兽,分别去利用完全背包得到最后DP结果,可是怪兽数量(取值1~10^5)太大,复杂度达到O(10^9),所以一定会超时,而且思路不是最佳的正确的解法就是普通的DP,dp[i][t]表示防御力为i(取值0~10),生命值为t(取值1~1000)的怪兽被打败需要的最小晶石数,再加入j(取值1~100原创 2017-08-07 00:26:51 · 699 阅读 · 0 评论 -
POJ 2955 Brackets(区间DP)
题目链接:点击打开链接题意:最大括号匹配,区间DP经典入门题目dp[i][j]表示从i到j的最大匹配数,遍历i,j的合法组合,若s[i] == s[j],先令dp[i][j] = dp[i + 1][j - 1],再去枚举i,j之间的位置t,利用dp[i][j] = max(dp[i][j], dp[i][t] + dp[t + 1][j])更新dp[i][j]。// POJ 2955原创 2017-08-04 20:08:56 · 341 阅读 · 0 评论 -
LightOJ 1422 Halloween Costumes(区间DP)
题目链接:点击打开链接题意:按题目序号顺序参加舞会,每个舞会对衣服都有要求,身上可以套好多件衣服,需要时候就脱下来,但脱下来之后,这件衣服就不能再用了,最少需要几件衣服?思路:区间DP,dp[i][j]表示从i到j舞会最少需要的衣服,边界DP[i][i] = 1;对于区间i,j,若a[i] = a[j],则j舞会直接穿i的衣服即可,先令dp[i][j] = dp[i][j -原创 2017-08-04 19:05:44 · 330 阅读 · 0 评论 -
POJ 1185 炮兵阵地(状压DP)
题目链接:点击打开链接思路:很容易想到把地图转化为0 1矩阵,从而对每行再用到状态压缩,山用1表示,空地用0表示,即把地图也用状态压缩的方式存起来,便于以后处理。开始先根据一行中每个炮的影响范围为左右各两个距离,枚举出对于行来说,满足要求的排放状态。然后枚举每行的状态时,先判断此状态和原始地图的二进制表示冲不冲突,因为用1代表的H(山地),加上只能空地放炮,所以把状态和本行二进原创 2017-08-03 22:56:36 · 327 阅读 · 0 评论 -
POJ 3254 Corn Fields(状压DP)
题目链接:点击打开链接题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多少种放法。对于0-1状态矩阵,自然而然会想到用状态压缩来做,把一行的状态压缩成一个十进制数。根据题目所说不能挨着种植,即这一行的某个位置种植了,下一行的同一位置就不能种植,可以知道两行的种植状态相位与要为0。另外一行中相邻的格子是不能同时种植的原创 2017-08-03 13:29:45 · 323 阅读 · 0 评论 -
动态规划
转载自:点击打开链接 感谢博主!一、基本概念动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求转载 2017-08-10 10:45:18 · 315 阅读 · 0 评论 -
POJ 3342 Party at Hali-Bula(树形DP)
题目链接:点击打开链接题意:给定一个树,选择若干节点,使得选择的结点中任一结点不会和它的子结点同时被选择,求能选节点的最大数量,并且统计选择方案是否唯一。之前做过这个题,只不过没加入唯一性判断。唯一性判断的方法也基于动态规划思想,开个二维数组,flag[v][2],用于标记选择或者不选择当前节点时,最大数量方法的唯一性,唯一性由后继节点决定。对于flag[fa][1],由于dp[fa]原创 2017-08-03 00:13:03 · 348 阅读 · 0 评论 -
HDU 1087 Super Jumping! Jumping! Jumping!(基础DP)
题目链接:点击打开链接题意:求最大公共子序列和// HDU 1087 Super Jumping! Jumping! Jumping!.cpp 运行/限制:31ms/1000ms#include #include #include #include using namespace std;int main(){ int n, re, a[1005], dp[1005]; w原创 2017-08-02 21:21:18 · 304 阅读 · 0 评论 -
ZOJ 3201 Tree of Tree(树形DP+背包)
题目链接:点击打开链接题意:给一棵节点带权树,找到一个有k个节点的子树,这个子树的有最大权值思路:树形dp+背包。dp[i][j]表示以i为根节点且有j个节点的子树的最大权值,对i的每个子节点做分组背包,选择适合数量的节点分配给它。dp[i][j] = max{ max{dp[i][j-t] + dp[v][t] | 1<=t<j} | v是i的儿子节点},ans = ma原创 2017-08-02 09:12:08 · 497 阅读 · 0 评论 -
HDU 4734 F(x)(数位DP)
题目链接:点击打开链接题意:F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1,Ai是十进制数位,给出a、b,求区间[0,b]内满足f(i)=f(a)的i的个数。思路:数位DP,dp[pos][sum]表示在!limit情况下,第pos个位置及其以后的数位的f(x)值为sum的情况有多少种。每组测试数据,先算出f(a),原创 2017-08-08 20:39:56 · 348 阅读 · 0 评论 -
HDU 2196 Computer(树形DP)
题目链接:点击打开链接题意:求树上每个点到其他点的最长距离。思路:典型的树形DP,分析发现,当前节点的最大距离只有两种来源,一种是它到叶子节点的最大距离,一种是经过父亲节点的最大距离,不过,如果父亲节点的最大距离等于父亲节点经过当前节点的最大距离,方案是不可取的,即此处取的是父亲节点到叶子节点不经过当前点的最大距离 + 到当前点的距离,因为要求不经过当前点,所以我们求当前节点到叶子节点原创 2017-08-28 21:53:50 · 383 阅读 · 0 评论 -
POJ 3311 Hie with the Pie(状压DP)
题目链接:点击打开链接题意:从起点出发访问所有的点最后回到出发点,每个点可以多次经过,问最小时间花费。思路:由于每个点可以多次经过,所以可以考虑先用floyd算法求出最短路,然后进行状压DP,当前访问过的点压缩成二进制状态,每个位代表一个点,1表示访问过,0表示未访问过,dp[state][v],表示在state状态下,且最后一个访问到的点为v时的最小时间花费。由于起点编号为0,其他点从1原创 2017-08-30 21:20:47 · 406 阅读 · 0 评论 -
Wannafly挑战赛1 Treepath(树形DP,思维)
题目链接:点击打开链接思路:除了树形DP,自己没想到其他思路,直接就写的DP......开的数组形式为dp[n][3],对于当前父节点,dp[x][0]、dp[x][1]表示已经遍历过的子树中,从该父节点出发到子树节点的路径长度为奇、偶的路径条数;dp[x][2]表示以该父节点为树根的树,满足条件的情况总数。dp[x][2]可以不开,更节省空间,直接用一个变量存储最后的结果即可。具体状态转原创 2017-10-14 09:40:13 · 1185 阅读 · 0 评论 -
单调队列优化多重背包
我们知道能用单调队列优化的DP问题需要满足:dp[i] = max / min (f[k])+ g[i] (k 多重背包问题多用二进制优化,优化后的复杂度为O(NVΣlogni)。多重背包问题的状态转移也能转化成此状态转移方程,从而利用单调队列优化,优化后的复杂度为O(NV)。具体思路:对于第i件物品:已知体积为we,价值为val,数量为num,可以按照we的余数,将原创 2017-09-21 16:58:46 · 950 阅读 · 0 评论 -
HDU 3401 Trade(用单调队列优化DP)
题目链接:点击打开链接题意:给出T天内,每天的股票买卖价格和每天的股票买卖最大数量,而且每天最多只能拥有maxP数量的股票,开始时有无限本金,任意两次交易需要间隔W天及以上,也就是第i天交易,第i+w+1天及以后才能再交易。问最多能赚多少钱?思路:很明显的DP问题,用dp[i][j]表示第i天拥有j数量股票时的最多赚钱数。容易得到状态转移方程:(1)当天不买不卖:dp[i][j原创 2017-09-19 19:43:31 · 474 阅读 · 0 评论 -
POJ 3252 Round Numbers(数位DP)
题目链接:点击打开链接题意:求一个区间内满足化为二进制后0多于1的数的数量。思路:很明显的数位DP,dp[pos][num]表示当前数位及以后,0减去1的数量为num的方案数。需要注意的是0的数量可能小于1的数量,所以会出现负数,因此要对数进行哈希,int为32位,那么num的取值为[-32,32],可以把0映射为32,即[-32,32]映射到[0,64]。这题还要注意前导0,前导0是不能原创 2017-09-02 17:22:50 · 336 阅读 · 0 评论 -
HDU 2844 Coins(多重背包)
题目链接:点击打开链接题意:给出一些种类的硬币,每类硬币均有一定面值和数量,问用这些硬币能组成位于[1,m]范围内的多少种面值?思路:背包中的可达性问题,按照经验,如果只求最值,dp数组为常规的即可,初始化为全0;如果既求最值又判断可达性,dp数组最好初始化为-1作为不可达的判断,且dp[0]初始化为0;此题只判断可达性,其实连dp数组都用不到,直接开数组标记判断结果即可。网上不少人采原创 2017-09-10 21:54:07 · 343 阅读 · 0 评论 -
CodeForces 149D Coloring Brackets(区间DP)
题目链接:点击打开链接题意:给出一个括号序列,该序列保证是合法的,即每个括号都能找到唯一的一个匹配括号。给出下列三个染色规则,问有多少种染色情况?1.每个括号要么不涂色,要么涂红色或者蓝色。2.每一对匹配括号,必须有一个且仅有一个被涂色。3.两个相邻的括号不能有相同的颜色。(若两者均未涂色也可以)思路:之前做过最大匹配括号数目的题目,是区间DP问题,此题也可以采用区间DP来做,原创 2017-09-01 16:13:05 · 448 阅读 · 0 评论 -
多重背包
多重背包:有N种物品和一个体积为V的背包。第i种物品最多有n[i]件可用,每件体积是w[i],价值是v[i]。将哪些物品装入背包可使这些物品的体积总和不超过背包体积,且价值总和最大?动态规划:dp[i][j]表示前i种物品放入体积为j的背包中的最大价值。状态转移方程:dp[i][j] = max{ f[i-1][j - k*w[i]] + k*v[i]},0 完全按照此原创 2017-09-10 15:52:42 · 1086 阅读 · 1 评论 -
完全背包
完全背包:在N种物品中选取若干件(同一种物品可多次选取),放在体积为V的背包里,每种物品的体积为w1,w2......wn,与之相对应的价值为v1,v2......vn,求解怎么装物品可使背包里物品总价值最大?动态规划:dp[i][j]表示前i种物品中选取若干件物品放入体积为j的背包中所能得到的最大价值。状态转移方程:dp[i][j] = max(dp[ i - 1 ][ j原创 2017-09-09 12:58:40 · 382 阅读 · 0 评论 -
HDU 2829 Lawrence(四边形不等式优化DP)
题目链接:点击打开链接题意:铁路上有n个站点,每个站可以往其他站运送粮草,现在要炸掉m段铁路(两个站点之间为一段)使得粮草补给之和最小,每个站的粮草补给为 该站点的值 和 能与之连通的站点的值 的积 之和思路:动态规划问题,用dp[i][j]表示前j个站点炸掉i段得到的最小值。状态转移方程与前篇POJ 1160 Post Office问题类似:dp[i][j] = min(dp[i -原创 2017-09-26 08:57:30 · 652 阅读 · 0 评论 -
HDU 2159 FATE(二维完全背包)
题目链接:点击打开链接思路:二维完全背包。虽然每个怪兽的数量没有限制,但怪兽总数量有限制,所以除了忍耐度,还要加一维怪兽数量。题目要求剩余忍耐度尽可能的大,所以这里把枚举忍耐度放到第一层循环,当忍耐度枚举到一个下限能达到所需经验值,停止枚举。// HDU 2159 FATE.cpp 运行/限制:0ms/1000ms#include #include #include #incl原创 2017-09-09 15:22:36 · 347 阅读 · 0 评论 -
POJ 1160 Post Office(经典DP)
题目链接:点击打开链接题意:一条高速公路,有N个村庄,每个村庄均有一个唯一的坐标,选择P个村庄建邮局,问怎么选择,才能使每个村庄到其最近邮局的距离和最小?最后打印这个最小值。思路:典型的DP问题。当我们在v个村庄中只建一个邮局,可以推导出,只有邮局位于中间位置,距离和才最小;有一个特殊情况是,当村庄数为偶数,中间位置有两个村庄,经过计算,两个村庄的距离和相等,所以俩位置均可。可以联原创 2017-09-25 17:55:10 · 3014 阅读 · 1 评论 -
ZOJ 1134 Strategic Game(树形DP)
题目链接:点击打开链接题意:一个树形图,在节点上安排士兵,每个士兵能看到与这个节点相连的边,问最少安排多少士兵能看到所有的边很显然是树形DP,二维数组dp[i][2],dp[i][0]是以当前节点为根的子树,在树根不放士兵的情况下该子树最少安排的士兵;dp[i][1]是以当前节点为根的子树,在树根放士兵的情况下该子树最少安排的士兵// ZOJ 1134 Strategic Game.c原创 2017-08-01 22:31:55 · 308 阅读 · 0 评论 -
HDU 2089 不要62(数位DP)
题目链接:点击打开链接题意:中文题目,很显然思路:数位DP入门,DP函数有四个参量,当前位置,前一位的数字,前一位是否为6,前几位取值是否都是上限。dp[i][state]表示第i位在limit(limit对应第四个参量)取0时,该state状态下(state对应第三个参量)剩余位数(包括本位)取值满足条件的方案和。// HDU 2089 不要62.cpp 运行/限制:0ms/1000原创 2017-08-08 11:01:18 · 298 阅读 · 0 评论 -
hdu 1024 Max Sum Plus Plus
题目链接:点击打开链接参考:点击打开链接 感谢博主kuangbin大神!本题的大致意思为给定一个数组,求其分成m个不相交子段和最大值的问题。状态dp[i][j]:前j个数,组成i组的和的最大值。决策:第j个数,是在第包含在第i组里面,还是自己独立成组。方程:dp[i][j]=max(dp[i][j-1]+a[j] , max( dp[i-1][k] ) + a[j原创 2017-05-09 22:45:15 · 381 阅读 · 0 评论 -
HDU 2602 Bone Collector(01背包)
Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave … The bone collecto原创 2016-11-12 10:48:00 · 381 阅读 · 0 评论 -
递归,递推,分治,贪心,动态规划......
一.递归:函数调用自身二.递推:由递推公式求解,每个子问题均有确切的解,即每个阶段只有一个状态,静态过程。实现:1.自顶向下,递归,有时遇到重复计算的项,可以先存到外部数组,用到时先判断有没有计算过 2.自底向上,解决掉了存在重复用的项的问题 例子:斐波那契数列三.分治:大问题分解为小问题,再整合成大问题。满足:1) 该问题的规模缩小到一定的程度就可以容易地解决2) 该问题原创 2017-02-23 19:39:30 · 1167 阅读 · 0 评论 -
动态规划与矩阵快速幂
动态规划的求解有时也可以通过矩阵快速幂优化,详见15蓝桥省赛9题,垒骰子原创 2017-02-05 14:07:04 · 460 阅读 · 0 评论 -
HDU 1003 最大连续子段和
最大连续子段和HDU 1003DescriptionGiven a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 +原创 2016-11-12 11:47:32 · 412 阅读 · 0 评论 -
最长递增子序列
//动态规划#include #include #include using namespace std;#define MAXN 10int dp[MAXN];int main(){ int array[MAXN]; int max=0; for(int i=0;i<MAXN;i++) cin>>array[i]; for(int t=0;t<MAXN;t++)原创 2016-11-15 23:15:18 · 357 阅读 · 0 评论 -
最长公共子串
找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。而最长公共子序列则并不要求连续。动态转移方程为:如果xi == yj, 则 c[i][j] = c[i-1][j-1]+1如果xi ! = yj, 那么c[i][j] = 0//动态规划#include #include #include using namespace std;int dp[101][101];int原创 2016-11-15 22:53:39 · 298 阅读 · 0 评论 -
最长公共子序列
最长公共子序列举个例子,cnblogs这个字符串中子序列有多少个呢?很显然有27个,比如其中的cb,cgs等等都是其子序列,我们可以看出子序列不见得一定是连续的,连续的那是子串。从图中我们看到了最长公共子序列为blog,仔细想想我们可以发现其实最长公共子序列的个数不是唯一的,可能会有两个以上,但是长度一定是唯一的,比如这里的最长公共子序列的长度为4。原创 2016-11-15 22:32:57 · 369 阅读 · 0 评论 -
HDU 1081 最大子阵和
DescriptionGiven a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1 x 1 or greater located within the whole array. The sum of a rectangl原创 2016-10-07 22:36:39 · 442 阅读 · 0 评论 -
Maximum Subsequence Sum
01-复杂度2 Maximum Subsequence Sum (25分)Given a sequence of KK integers { N_1N1, N_2N2, ..., N_KNK }. A continuous subsequence is defined to be { N_iNi, N_{i+1}Ni+1, ...,原创 2016-09-24 23:01:50 · 1371 阅读 · 1 评论 -
最大子段和(分治与动态规划典例)
最大子段和 问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n 例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2原创 2016-08-18 20:16:58 · 13889 阅读 · 0 评论 -
HDU 2084 数塔
Problem Description在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?已经告诉你了,这是个DP的题目,你能AC吗? Input输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1原创 2016-09-04 21:01:26 · 435 阅读 · 0 评论 -
0-1背包(DP经典问题)
有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。方案一:dp[i][j]表示1~i号物品放到体积为j的背包中的最大值状态转移方程为:dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])实现:可自底向上和自顶向下自底向上: dp[N+1][V+1]; memset(dp,原创 2017-03-08 16:52:44 · 1039 阅读 · 0 评论