![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 52
曼切斯特的流氓
007
展开
-
完全背包问题(详细解答)
首先完全背包问题需要01背包问题做铺垫,如果读者01背包问题没有解决,一定要理解之后,在看完全背包问题,包括01背包的优化!这里是01背包这里是01背包的全部优化好,我们开始完全背包!完全背包定义有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的体积是v[i],价值是val[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。从定义中可以看出,与01背包的区别01背包最多只能拿一件物品,完全背包则不然,只要空间够多,一种物品我可以拿n件!01原创 2021-03-22 21:31:31 · 27974 阅读 · 21 评论 -
01背包问题相关优化大全(二维到一维)
下面是普通版本的01背包代码!int dp[105][1005]; for(int i=1;i<=m;i++) for(int j=t;j>=0;j--) { if(j>=w[i]) { dp[i][j]=max(dp[i-1][j-w[i]]+v[i],dp[i-1][j]); }else{ dp[i][j]=dp[原创 2021-03-22 17:59:41 · 3817 阅读 · 4 评论 -
01背包问题
首先背包问题,属于动态规划问题,动态规划问题我们主要是找出动态转移方程!我们用一道例题讲解:让我假设现在的背包的容量是 C=10物品编号:1 2 3物品重量:5 6 4物品价值:20 10 12用v[i]表示物品价值,w[i]表示物品重量,要使得放入背包的物品价值最大化,我们知道用贪心是不行的!动态转移方程:dp[i][j]=max( (dp[i-1][ j−w[i] ] ) + v[i] , dp[i-1][j])定义状态原创 2021-03-22 15:04:19 · 4126 阅读 · 4 评论 -
隔板问题(状态机dp)
i>k+1时,第i个位置可以是0,也可以是1,当是0时,那么f(i)=f(i-1),如果是1时,f(i)=f(i-k-1)继承过来,所以f(i)=f(i-1)+f(i-k-1)前k+1个位置,每个位置f(i)=i+1,枚举1放的位置,或者全部是0。原创 2023-06-02 19:54:10 · 127 阅读 · 0 评论 -
单调队列优化区间内最值问题
暴力做法(70分)longlong0x7f7f7f7f单调队列优化sum(i)-sum(j)每次单调队列维护[i-m,i]内的sum(j)最小值,复杂度变为O(n)longlong0x7f7f7f7fsum[i]-sum[j]维护sum[i]最小,只要区间内最小值减去边界都大于等于0,那么说明这个区间一定合法,用数学的理解就是最小值都减去一个数都大于零但那么这个区间内任何一个数都必然大于0上一道题维护的是sum(j)longlong0x7f7f7f7f。原创 2023-04-15 19:51:19 · 56 阅读 · 1 评论 -
树上状态机
f(i,1) 中需要枚举每个点照亮父亲的情况 (i为父亲节点,j为子节点)每一条边至少选择一个点。0表示不选,1表示选。原创 2023-04-13 22:15:50 · 35 阅读 · 0 评论 -
树形dp(例题)
这个要分析当前节点紧挨着的父节点,无非两种情况,第一种是其父节点向上最长,第二种是其父节点向下最长那么第二种情况需要讨论,如果父亲节点最长距离d1、次长距离d2,其中d1如果不经过儿子节点,那么儿子节点向上最长一定是max(up[父亲],d1)+w*(父亲儿子之间权值)*,如果d1经过儿子节点,那么d1无法使用,只能使用d2那么儿子向上最长就是max(up[父亲],d2)+w。从上图可以看出,每次要两个变量存放以u为根,最长路径d1,和次长路径d2,那么整个树的最长路径就有可能是d1+d2。原创 2023-04-13 21:59:14 · 140 阅读 · 0 评论 -
最长上升公共子序列
LCIS的状态多了一个限制就是必须以b[j]结尾如果a(i)!=b(j) 那么f(i,j)最优解必定是f(i-1,j)根据状态定义必须含有b(j)如果a(i)==b(j),那么就要讨论f(i,j)是从(1,j) 、(1,2,j)、(1,2,3,j)…(1,2,3,…,j)转移过来这就是这个动态转移方程 f[i][j]=max(f[i][j],f[i][k]+1);(1<=k<j) +1表示带上b(j)原创 2023-04-13 09:59:32 · 127 阅读 · 0 评论 -
导弹防御系统(dfs+贪心)
数据量比较小,可以通过深搜来完成,每次枚举当前高度,放到上升序列或者下降序列中,全排列思想去枚举得到结果。1、用一个单调队列维护每个系统最后一枚导弹高度,这个高度在队列中是由小到大的。3、如果找不到那么需要新开一个系统。2、每次判断是否能找到合适的系统。原创 2023-04-12 21:27:23 · 51 阅读 · 0 评论 -
最长上升子序列(几道例题)
注意细节:先上升后下降,上升时正常求上升子序列,下降时要注意,不能从前向后求最长下降子序列,那样的话导致i到i+n这段并不一定是下降的,因为你只控制了1到i这段是下降的,所以只有从后向前求最长上升,这样求出来从i到n一定是递减!这道题从前向后求最长递减,或者从后向前求最长递增都可以,因为他要整个区间的结果。这道题是dp+贪心,贪心的核心是让每一个系统中最后一个导弹高度尽量的大,这样。1、用一个单调队列维护每个系统最后一枚导弹高度,这个高度在队列中是由小到大的。3、如果找不到那么需要新开一个系统。原创 2023-04-12 21:04:19 · 66 阅读 · 0 评论 -
友好城市(最长上升子序列)
先将一侧按坐标由小到大排序,然后每次判断当前i号城市对应的友好城市是否和j号友好城市不交叉,具体就是i.y>j.y才不会交叉。难点在于分析出这道题是用最长上升子序列来解决。原创 2023-04-12 17:01:22 · 234 阅读 · 0 评论 -
股票买卖V(有冷冻期)
0表示没有股票,1表示手里有股票,2表示进入冷冻期。原创 2023-04-12 11:30:04 · 56 阅读 · 0 评论 -
股票买卖IV(状态机三维)
【代码】股票买卖IV(状态机三维)原创 2023-04-12 10:56:57 · 44 阅读 · 0 评论 -
宠物小精灵之收服(二维背包)
注意保证皮卡丘体力大于0,所以不能从m开始,要从m-1开始。原创 2023-04-10 12:08:37 · 62 阅读 · 0 评论 -
接龙数列(线性dp)蓝桥杯十四届
状态转移,f(i,j)每次先继承上一轮结果,只有第i个数首位等于f(i,j)的j时才能更新,所以只要相等就比较选出最大值即可!集合表示f(i,j)枚举到前i个数,以j为结尾,序列中最大加入多少个数。原创 2023-04-10 11:30:50 · 349 阅读 · 0 评论 -
背包体积最多、恰好、至少情况结论
原创 2023-04-02 19:18:08 · 53 阅读 · 0 评论 -
有依赖的背包(树上分组背包)
这道题目的关键在于选择当前节点时,必须考虑究竟选择那几个子树,比如有k个子树,那么就有2的k次幂种不同选择(二进制枚举) ,数量过于庞大,我们可以另辟蹊径,考虑子树的体积,将不同体积视为不同物品,进行分组背包,子树选择何种体积才能使得f(u,j)的价值最大。f(u,j-k)应该是上一个子树的最优解,不应该是当前子树的最优解,如果是当前子树的话,那么说明f(u,j-k)已经把当前子树加入到最优解中了,在加入f(son,k)会造成重复加入某些节点。:f(u,j) 以u为根的树,当前体积为j所产生的最大价值。原创 2023-04-02 15:08:02 · 102 阅读 · 0 评论 -
二维背包(至少是)问题
"的二维背包问题,以前我们f(i,j,k)中j,k都是最多是j和k,那这道题求出氧气和氮气至少为m和n,也就是f(i,j,k)中蕴含的价值所包含的实际j和k可能大于f(i,j,k)中的j和k。状态转移方程:f(i, j, k)=min(f(i-1, j ,k), f(i-1, max(j-v1,0), max(k-v2,0))+w)原创 2023-04-02 10:45:53 · 52 阅读 · 0 评论 -
混合背包(精简)
混合背包不论i-1状态发生了什么,我只要用到他的结果,进行第i轮状态转移,根据第i轮为什么背包问题他的状态转移方程不同。原创 2023-04-01 23:56:52 · 42 阅读 · 0 评论 -
状态压缩dp(影响两行例题)
f(i,a,b,k)第i行状态为a,i-1行状态为b已经拜访了k个国王的方案数量。f(i,j,k) 第i行状态为j,第i-1行状态为k。1、相邻两行不能有中间空隔一列相邻的两个1。2、相隔两行不能有连续两个1。原创 2023-03-25 00:52:09 · 35 阅读 · 0 评论 -
费用报销(01背包变种问题)
但是又因为有一个相邻日期大于等于K的限制,所以并不是每个物品可以相邻,也就是01背包的动态转移方程为f(i,j)=max(f(i-1,j),f(i-1,j-w)+v) ,当拿走第i个物品时一定考虑他和上一个物品最近日期超过K这一合法性判断,所以我们要预处理每个物品最近日期并且大于等于K天的相邻物品存放到一个数组里,这样每次拿走第i个物品时,只需要从他距离日期最近并且合法的物品转移过来即可。动态转移方程:f[i][j]=max(f[i-1][j], f[上一次临界合法的发票][j-wi]+vi);原创 2023-03-23 04:36:32 · 54 阅读 · 0 评论 -
背包中方案数量问题
这道题本质是给出n个物品,利用该物品的体积,能够凑出多少种不同的体积。每一个砝码都可以放在左侧和右侧,或者不放,那么就有三种情况。二维背包(个数限制为10个不同数字+数的和为2022)原创 2023-03-22 00:20:38 · 60 阅读 · 0 评论 -
李白打酒加强版(路线dp)
【代码】李白打酒加强版(路线dp)原创 2023-03-21 00:49:39 · 85 阅读 · 0 评论 -
状态压缩dp
状压dp原创 2023-03-21 00:10:34 · 91 阅读 · 0 评论 -
线性DP-----(路线DP)
线性DP原创 2023-01-14 00:21:50 · 689 阅读 · 0 评论 -
分组背包(代码)
分组背包原创 2022-06-16 20:08:21 · 200 阅读 · 1 评论 -
多重背包问题大全(超详细)
题目:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。首先多重背包问题可以转换为01背包来解决,关键就是如何转换!我们先来一种最基本的解法。朴素解法基本思想:比如第i件物品有s个,我可以把相同种类的物品的进行合并,比如我拿出两件合并出一个新的物品,我拿出三件合并出一个新的物品,以此类推,我拿出s个合并出一个新的物品。基于这种思想,我们把第i件的s个物品转换为s种体积各不原创 2021-03-25 21:22:51 · 13661 阅读 · 14 评论 -
快速幂+矩阵优化斐波那契数列(超详细教程)
文章目录前言一、快速幂二、矩阵优化斐波那契数列1.矩阵相关知识2.斐波那契数列用矩阵表示3.O(log2n)的斐波那契数列总结前言我们首先讲解快速幂,然后利用快速幂优化矩阵相乘,将O(n)算法变为O(log2n),紧接着我们用矩阵,优化斐波那契数列!一、快速幂通常我们算一个数(a)的n次幂,我们需要计算n次,也就是n个a相乘,这样难免太过缓慢,于是有了快速幂,即不需要n次操作就可以算出!举例:计算A的9次幂通过上述操作想必大家明白,快速幂的思想也就是二分的思想!代码实现:#include原创 2021-03-24 10:53:42 · 6837 阅读 · 0 评论 -
LCS最长公共子序列
最长公共子序列:顾名思义从两段序列中选出,其中连续并且相同的子串举例a串:1 5 7 9 6 3b串:1 6 3 2 1 5最长公共子序列 c串:1 6 3我们如何实现呢?(假设a串有n个数字,b串有m个数字)我们需要一个二位数组f,通过这个二维数组存放 f(i,j)f(i,j)含义:表示a串前i个数字,和b串前j个数字,能构成的最长公共子序列!那么我们最后的答案一定是f(n,m) 因为从f(1,1),一直遍历到f(n,m)最长子序列一定逐渐增加,即使一成不变,那也是f(n,m)最原创 2021-03-22 10:56:21 · 109 阅读 · 0 评论 -
LIS最长上升子序列
LIS:从一串数字序列,找出连续递增的子序列,并且要求子序列最长!举例:一段序列:1,6,2,3,7,5,9,4,11最长上升子序列为:1,2,3,7,9,11那么我们如何通过代码实现呢?我们需要一个数组f,然后通过f记录每一个数字的最大上升子序列。初始时每一个f[i]=1,因为那怕找不到任意一个子序列,那么他们自身也算是最长上升子序列。(最长上升子序列不一定为一个,可能长度相同的多个!)我先把代码展示出来,然后详细给大家讲解如何实现! for(int i=1; i<=n;原创 2021-03-21 21:52:14 · 124 阅读 · 0 评论 -
铺方格(升级版递推)详细解答
题目:有一个大小是2xN的网格,现在需要用2种规格的骨牌铺满,骨牌的规格分别是2x1和2x2,请计算一共有多少铺设的方法。(从左向右铺)输入:T组数据,N网格列数 (0<N<=50)输出:所有方案mSample Input132Sample Output153解题思路:这道题和超级楼梯有异曲同工之妙,建议先看下超级楼梯。附上超链接!超级楼梯首先这道题有三种铺设方法,第一种竖着放2x1的砖,第二种横着放2x1的砖,第三种放2x2的砖!但是不可以错位横着铺设,不然会原创 2021-03-20 11:59:51 · 388 阅读 · 0 评论 -
超级楼梯(递推)
题目:有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?输入:输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。输出:对于每个测试实例,请输出不同走法的数量Sample Input223Sample Output12解题思路:首先从题意分析,每一次有两种走法,第一种是走一个台阶,第二种是走两个台阶,我们从后往前看,如果它走到了第i级台阶,那么它的上一次走法有原创 2021-03-20 10:57:26 · 2046 阅读 · 2 评论