
动态规划
文章平均质量分 74
本菜鸡尽量每学一个动态规划就写一篇
麻里绿豆饼
雀食雀食蟀啊
展开
-
树形DP,树的最长路径(直径)
题意一颗树有n个点,并且有n-1条无向边,每条边都有边权,问这颗树的最长路径是多少。思路最长路径中的点的类型有两种,一种是这个点为最长路径的端点,另一种是这个点是最长路径的中间节点。因为是无向树,所以我们可以以任意一个点为根节点,所以当我们确认根节点后,我们可以计算出所有点的向下走的最长距离和次长距离,次长距离和最长距离加起来就是以这个点为悬挂点的最长路径(悬挂点:以这个点为最高点),然后不断更新树的最长路径。我们不用考虑向上的走的方式,因为如果当前点为数的直径中的节点,并且下一个点在上面的话,我们这原创 2021-09-27 23:59:01 · 267 阅读 · 0 评论 -
状态压缩DP
状态压缩dp通常是将每一种状态转化为二进制数,从而枚举每一个二进制数,从而判断每一种状态。Ⅰ:莫德里安的猜想: 在NM的棋盘分割成若干个12的长方形,有多少种方案直接想的话,难以下手,所以我们考虑将每一列的状态转化为用01表示的,0表示上一列的这一行没有伸出一个小方格,1则表示上一行有伸出一个小方格用f[i][j]f[i][j]f[i][j]存储状态:表示第iii列伸出了多少小方格,这个状态由jjj用二进制存储,若有5行也就是jjj的状态有0~31,(若第一行有其余都没有,那就是10000=16)即把原创 2021-09-16 15:47:57 · 162 阅读 · 0 评论 -
浅谈状态机
这东西怎么说呢,我也是一知半解,不能述其所有。但是我后面要讲的是将状态机这个模型应用到动态规划中去,所以如果是单单如此的应用的话我还是觉得我可以大致讲的明白的(针对小白而言,因为我也是小白哈哈哈)。如果我讲的有哪些地方不正确,或者不清楚的,希望你们可以评论指出,我一定第一时间学习与交流。状态机这个东西如同其字面所描述的一样,就是将每一个状态,以及状态间转移的所有方式组成一个整体。而应用到动态方程的就是我们可以通过上一个的状态的所有情况来退出这个当前状态的所有情况,不用推到前几个状态。这样就可以让我们更原创 2021-09-15 21:42:35 · 132 阅读 · 0 评论 -
背包问题求具体方案
题目要求求出01背包的具体方案,要求按照最小字典序输出。思路因为要输出背包的方案,我们可以从最后一个向第一个物品判断,判断完后从第一个物品向后递推,递推是由哪一个物品转移过来的。这样就可以输出具体方案了。但是题目又要求最小字典序输出,所以我们只需要从第一个开始的物品开始遇到可以选的物品就必选,这样就可以让字典序最小了。#include<iostream>using namespace std;const int N=1010;int n,m;int v[N],w[N];i原创 2021-09-11 22:14:34 · 172 阅读 · 0 评论 -
二维费用的背包问题(潜水员)
感觉大多数人都没有讲清楚 ,我尝试看看,能不能用我笨拙的语言解释清楚,从而让更多人能够理解题目潜水员为了潜水要带足够的氧气和氮气。他有若干个带两种气体的气缸:氧气和氮气。每个气缸都有各自的重量和两种的气体含量。潜水员为了完成他的工作需要一定数量的氧气和氮气。问他完成工作所需气缸的总重的最小重量的是多少?输入第一行有2整数m,n(1≤m≤21,1≤n≤79)。它们表示氧,氮各自需要的量。第二行为整数k(1≤n≤1000)表示气缸的个数。此后的k行,每行包括aia_iai,bib_ibi,cic原创 2021-09-11 20:40:26 · 236 阅读 · 0 评论 -
01背包之二维费用
宠物小精灵收服题目思路具体代码题目宠物小精灵是一部讲述小智和他的搭档皮卡丘一起冒险的故事。一天,小智和皮卡丘来到了小精灵狩猎场,里面有很多珍贵的野生宠物小精灵。小智也想收服其中的一些小精灵。然而,野生的小精灵并不那么容易被收服。对于每一个野生小精灵而言,小智可能需要使用很多个精灵球才能收服它,而在收服过程中,野生小精灵也会对皮卡丘造成一定的伤害(从而减少皮卡丘的体力)。当皮卡丘的体力小于等于0时,小智就必须结束狩猎(因为他需要给皮卡丘疗伤),而使得皮卡丘体力小于等于0的野生小精灵也不会被小智收服。当小原创 2021-09-09 00:34:03 · 147 阅读 · 0 评论 -
多重背包及其二进制/优先队列优化
多重背包定义:有一个固定容量的背包,并且有若干种物品,每种物品有 n i n_i ni个,每种物品所占的空间是 v i v_i vi,价值为 w i w_i wi,问如何取可以让背包内的物品的总价值最大。朴素的多重背包dpf [ i ] [ j ] f[i][j] f[i][j]的定义:表示从前 i i i种物品中选,背包容量为 j j j的情况下,所有选法的最大值。f [ i ] [ j ] = m a x ( f [ i ] [ j ] , f [ i − 1 ] [ j − k × v原创 2021-09-08 11:41:56 · 350 阅读 · 0 评论 -
多重背包的优化(二进制优化/单调队列优化)
多重背包定义:有一个固定容量的背包,并且有若干种物品,每种物品有nin_ini个,每种物品所占的空间是viv_ivi,价值为wiw_iwi,问如何取可以让背包内的物品的总价值最大。朴素的多重背包dpf[i][j]f[i][j]f[i][j]的定义:表示从前iii种物品中选,背包容量为jjj的情况下,所有选法的最大值。f[i][j]=max(f[i][j],f[i−1][j−k∗v[i]]+k∗w[i]);f[i][j]=max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);原创 2021-09-07 14:14:52 · 1033 阅读 · 0 评论