动态规划
爱莉我老婆
Java萌新算法选手一枚,去过蓝桥国赛。励志补全Java版本的算法模板
展开
-
动态规划入门之洛谷创始人kk偷懒摆烂
我们知道如果将这n道题目进行时间的尽量的均分的话,一般情况是会有一组时间超过一半,另外一半小于,我们选取这两半中最大的即可,这样依次累加就是答案。我们可以是使用01背包的思路,怎么想呢,我们让左脑的体积为总时间的一半,在不断使用01背包的方法往里加入时间,价值和体积就是思考问题的时间,最后我们能的到在一半时间内的最大思考时间,而由于之前提到的般情况是会有一组时间超过一半,另外一半小于,所以我们从总时间减去左脑的最大时间即是我们我们要求的,最后累加即可。原创 2023-08-24 21:03:54 · 194 阅读 · 0 评论 -
动态规划入门之走线段
我们第一时间可能会想到贪心(我就是使用的贪心,在dp里使用贪心实在是太酷啦),大家也许会模拟路线尽量选择最短,但实际上是过不了的,一旦上一条线段的终点正对着下一条线段的某个点时怎么办,所以我们想。我们以一条线段的左端点举例,我们是怎么到达一条线段的左端点的,无非两种选择,从上一条线段的右端点到达,从上一条线段的左端点到达。而从上一条端点往下走的前提条件就是我们已经走完了上一条线段,所以我们才会往下走,如果你不走完上一条线段的话,你不可能往下走。动规虐我千百遍,我带动规规如初恋。所以我们的dp的状态就有了。原创 2023-08-23 21:47:47 · 67 阅读 · 0 评论 -
动态规划入门之线性动态规划
题目的意思已经很明确了,就是说我们有n种花,每种花的数量依次是a1,a2,。an,问我们摆放m盆的方案数量。我们来想,假设我们只有一种花,它总共有4盆我们要求摆放三盆请问有几种方案,答案显而易见的是一种。在前面的条件上,我们再加上一种花,这种花有一盆,请问摆放三盆的种类数有几种?答案也好想,是2.我们怎么得出的答案。首先我们知道如果我们第二种类的花一个也不摆,那么就是1种方案,而我们摆放一个由于前一种花我们可以放两个,所以又是一种,所以答案加起来就是2.由此引出我们的状态转移方程。原创 2023-08-22 21:08:32 · 54 阅读 · 0 评论 -
动态规划入门之线性动态规划(点菜)
本题目,大家不要使用Java的快读与快输入。为什么呢,题目虽然说第二行输入全部菜品价格,但是很坑的点是它的真实输入并不是一行,而是两到三行不确定,所以大家使用简单的初级输入即可。好的,回归主题,如何写这个题目的dp。我们分析假如吃第i道菜,如果这道菜的价格刚好满足了总金额n那么我们就直接f【n】加1如果不满足,我们就要用其他的菜来补充,也就是。为什么我们这里要加上dp【e】呢,原因很简单,因为dp【e】代表着花费为e的种类数,在我考虑第n道菜时,它不一定为0,所以要加上它之前的值,同时加上前e-d的选择。原创 2023-08-21 21:17:22 · 122 阅读 · 0 评论 -
动态规划入门之二维数组的动态规划(过河卒)
不过有鉴于我们的dp通常从1,1开始,所以我们默认将所有的位置都加上1,起点从(1,1)开始。顺便确定边界条件,我们直到起点为(1,1)那么我们从起点开始,假设终点就是(1,1)那肯定就只有一条路径。解决这个问题之后,我们大家来想怎么做,从起点怎么到达终点,一个好想的思路是我们使用深搜dfs从起点来出发不断搜索,遇到封锁点换到另一个路线,最终到达终点。只能向右走和向下走,所以任何一个点,如果它可以被走到(这个点不是被封锁的点),那么它一定是从其上方的点和其左边的点走到的,那么我们的状态转移方程也就有了。原创 2023-08-18 16:48:59 · 486 阅读 · 1 评论 -
动态规划入门之01背包变形嗑药
我们把药品总量看成一个背包,我们把打败每一人的药品消耗看成体积,那么就是说我们把这个物品装进背包会产生一个价值,不装进背包也会产生一个价值。那么我们在01背包的基础上改进,可以写出如下状态转移方程。嗑药固然可耻,但是能让你快速变强 --鲁迅。这是01背包的模板,没看的可以去看看。原创 2023-08-18 10:08:00 · 682 阅读 · 0 评论 -
动态规划入门之线性动态规划
我们先选1然后我们在-2以及-2加1里边选,我们选-1,接着我们在-1以及5里边选我们选择5。由此我们发现我们选择是从以第n-1个数结尾的最长长度加上第n个数同第n个数比取最大的。正如我们在判断第二个数-2时,我们不确定加上第二个数是否可行,因为要求连续,所以我们。针对第二个数的策略只有加与不加,不加就从第二个数开始为起点加的话就累加,算最大的。同时我们还要在以某个数为终点的累加中取最大的。我们做动态规划首先考虑小情况,然后推而广之。题目要求求连续得一段子串使其累加和最大。假设三个数1,-2,5.原创 2023-08-17 17:55:43 · 630 阅读 · 0 评论 -
线性动态规划入门之挖地雷
比如1与3之间是1代表1可以到3而3不可以到1。我们这么想假设1与2,3,4都链接只有这两层,那么我们找到到达2,3,4这三个点的可以挖的地雷数量,然后找到最大的即可。这是针对两层,那三层呢,比如3,4又连接着,5.那么我们接着5从与5链接的3,4选出最大的,而不用关心3,4是怎么转化的。注意了,输出路径,我们开个前缀数组,这个数组记录每个点的前缀,最后我们选出最大路径是以那个点结尾,我们不断找他的前缀,直到他的某个前缀是0我们就可以输出x编号。dp【i】的含义是以i结尾的挖地雷的总值。原创 2023-08-16 21:02:46 · 188 阅读 · 0 评论 -
线性动态规划入门之数字三角形
怎么办,我们使用自然人的思维可以想到爆搜,就是从顶端开始不断递归直到低端,我们选出所有到达低端的最大值。所以说我们可以发现我们只关心当前层数的下一层的两个数的最大值,和这两个数的值是如何转变的不关心,而且我们上层改变数字和下层无关,也就是无后向性,因此我们写出dp方程。如图所示,当我们计算出从1开始到达低端的最大路径时,我们无需从第二行的8开始往下走路径,无需最算一遍1到低端的最大路径,直接调用即可。比较好想的优化是我们使用记忆化存储,走过一次的路径储存起来,到时再使用无需计算。原创 2023-08-16 16:15:36 · 80 阅读 · 0 评论 -
动态规划之安全序列
我们考虑在考虑第n个位置的摆放方案的数量时,我们一定确定的是第n位置的摆放物品所形成的序列的数量一定先等于n-1位置,假如n-1位置有3种,那么第n位置至少有3种,这时我们要分情况了,如果第n位置不能摆下一个物品,那么第n位置的序列数量就是n-1的序列数量再加1,为什么呢,考虑一个物品在第n位置放又多加一种呗。就是说第c个位置所含有的序列数量由摆放物品的dp[c-1-b]和不摆放物品的dp[c-1]组成,因为摆了物品,那么他的序列就等于前c-1-b的数量,不拜访,就等于c-1的数量。原创 2023-08-12 16:49:47 · 120 阅读 · 0 评论 -
动态规划系列之洗车
我们先来考虑两个洗车机器,我们可以依次枚举出其中一个洗车机器的洗车时间,另一个就是总时间减去前一个的时间。这个x一定是大于等于单个车中洗车时间的最小值小于等于所有车的总洗车时间。回到本题,我们就要去想,能否凑出一台机器在前n量车中洗了m台车耗时x的这个x,因此我们的状态就有了。dp[c][e],代表了物品,我们在c台车里通过洗一洗一些车子来凑出时间e来。前n量车里我们凑出e的情况是否存在取决于前n-1辆车我们呢能否凑出e或者前n-1辆车我们能否凑出e-b【n】来,最后在所有可以凑出来的时间里选最小的。原创 2023-08-12 10:48:20 · 123 阅读 · 0 评论 -
动态规划之建造房屋
那么当我们在第i街道建了k个房子,我们的dp数组dp[i][k+m]就是在前i个街道总共建了k+m个房子,由于我们的dp数组的状态不仅仅包含我们在第i街道建了k个房子这一种情况,因为我们想,要是我们前i-1个街道建造m-1个房子而我们在第i个街道键k+1个房子,我们最后也能达到dp[i][k+m]这个状态。所以我们就有了我们的状态转移方程dp[i][k+m]=dp[i][k+m]+dp[i-1][m].为什么累加,就是因为我之前讲的不仅仅一种情况到达dp[i][k+m]这个状态。每条街道至少建1个。原创 2023-08-11 15:56:15 · 207 阅读 · 0 评论