- 博客(46)
- 收藏
- 关注
原创 动态规划总结:7种dp + 模板
f [ i ] 表示以第i个数为结尾,最长的上升子序列个数。然后对i之前的数进行遍历,以此求出f [ i ]动态规划是从暴力dfs慢慢优化出来的算法,以本篇入门了解dp思想,之后再系统学习各类。f [ i ] [ j ] 表示在选到第 i 个物品,背包剩余体积为 j 时的最大总价值。本题有两种状态表示的方法,将其分类为a[ i ] 与 b[ i ] 是否相等更便于理解。本篇文章主要总和动态规划中常见类型的模板,详细的讲解在每个知识点下的链接中。最长上升子序列 ( LIS )最长公共子序列(Lcs)
2024-03-26 10:34:17 513
原创 二分查找:万能模板及详细例题
将木头按长度l切,使所有的木头切完后可以正好有k段,l越大越好,因此本题应该从l出发,枚举每种l的可能,找到恰好是不满足题意的那个点。:int: 2的30次方 long long:2的60次方,因此count需要开long long。要找到x的起始位置和结束位置,也就是要找到第一个不 x。思路:转换为A = B + C,枚举B,然后在数组中找A是否存在。方法1:枚举搬走哪块石头,但选择太多,一定会超时。方法2:枚举答案,即枚举最小跳跃距离,二分答案例题5:P2678-跳石头。
2024-03-25 21:00:46 1751
原创 从01背包开始动态规划:暴力解法 + dp + 滚动数组 + dp优化
如何直接将滚动数组的g删去,会导致 f 的更新错误,因为在更新 f [ j ] 时,f [ j - v [ i ] ] 已经更新过,也就是他在第 i 层,而更新时需要的是第 i - 1 层的数据,如下图:(下两图来源于b站up,一只会code的小金鱼)本题用两个数组来存储,其中 f 在更新前(memcpy(f , g , sizeof f))表示第 i - 1层的数,而 g 表示第i层的数,每一层完成后,对 f 进行更新。不选时,f [ i ] [ j ] 不变。方法四:dp优化,用一个数组存储。
2024-03-22 14:56:44 1228
原创 P2392 kkksc03考前临时抱佛脚:01背包思想
对于一个问题,一个子问题有两种选择,都可以采用01背包思想,由于本人对dp不是很熟练,因此采用dfs + 剪枝。由于左右脑可以同时计算两个题,,因此可以想到,每个题都有分给左脑还是右脑两种选择。
2024-04-03 12:03:17 206
原创 背包问题变形题:熟练使用三种背包模板
求把所有钱花的剩最少的情况下,有几种点菜方式,因此还是01背包,f [ i ] [ j ]表示处理到第i个物品,剩余体积为j时,不过里面存储的是点菜的方式。本题要求箱子里放东西,箱子的最小剩余空间,也就是求他的最大可装重量,因此可以。,即f [ i ] [ j ] 表示箱子可装最大的重量。每种菜都有选和不选两种情况。选和不选两种情况的方法数之和。把物体的重量当作他的价值。1-P1049 装箱问题。2-P1164 小A点菜。
2024-04-03 10:18:53 584
原创 P1002 过河卒:图论动态规划入门
本题与之前的动态规划不一样,比如背包问题和子序列问题等都是线性dp,也就是dp数组其实主要用于存储计算的结果,而这题中的dp数组除了存储结果外,还有。在贴一个dfs的代码,过了40/100,其他的超时了。
2024-04-02 20:34:11 919
原创 dfs之排列与组合
组合与排列不同的是组合对于同一种选择,只需要输出一次,不用输出不同顺序,因此每次dfs只需要从上一个数字后进行处理。今天发现又忘记了,所以在写一遍并发个题解记录。
2024-03-30 21:22:52 174
原创 7-字串简写:前缀和+滑块思想的学习
两个指针,一个begin,一个end,都 = 0,然后end往后走,自己一直自加,直到满足/不满足条件时(根据check函数设计),进行处理,然后begin+1,之后end再往后走,重复。不过我感觉这题不太适合滑动窗口,有点难理解。
2024-03-27 15:48:09 429
原创 3-冶炼金属:比二分更简单的双指针
从题可以看出,答案一定在1 ~ 最大转换率之间,这个最大转换率是其中一个冶炼金属方式的,可以在输入时直接找出。可以想象出满足条件的一定在1 ~ 最大转换率中,如下图所示,只要找到左右边界输出即可,因此可以考虑。的思路(二分学习中常用思路)出发。
2024-03-25 22:03:43 179
原创 石子合并与果子合并:区间动态规划和贪心
思路:本题为区间合并经典例题,平时思路为,如何将两个两个石子分别合并(递归,从上向下),而在区间合并中,应从结尾出发,将整堆石子分为两堆,再对这两堆继续分,直到分为一个个的石子(递推,从下向上)在区间dp遍历时,先遍历区间长度,再遍历区间左节点。
2024-03-24 16:40:07 511
原创 最短编辑距离:递推公式详解
修改这一位之前,a[1~(i-1)]应该与b[1~(j-1)]匹配。所以删除之前a[1~(i-1)]和b[1~j]匹配。那填之前a[1~i]和b[1~(j-1)]匹配。a [1 ~ i] 变得和 b[i ~ j ]相等需要的操作次数。:把a[ i ]删掉之后a[1~ i ]和b[1 ~ j]匹配。:插入之后a[i]与b[j]完全匹配,所以插入的就是b[j]现在请你求出,将 A 变为 B 至少需要进行多少次操作。具体分析过程见下图(图源自y总)f[ i ] [ j ] 表示。一定要考虑a或b为空的情况。
2024-03-23 22:38:06 265
原创 多重背包的动态规划:暴力dfs + dp + dp优化
本题可以当作完全背包问题的变形,在暴力时候用一个数组进行记忆化存储,在判断第 index 个物品存放的个数时,可以在dfs参数上加一个cnt用于计数,也可以直接用一个for循环。方法三:dp优化,一维数组。方法二:二维数组dp。
2024-03-23 13:20:31 385
原创 完全背包的动态规划:暴力dfs + dp + dp优化
递推数组初始值 = dfs递归边界。递推公式 = dfs向下递归公式。方法二:dp,二维数组。
2024-03-22 16:09:41 410
原创 从跳台阶开始dp优化:三种解法 + 详细解读
其中 f(n)是第n个台阶时的方案数, 因为每次只能走一或两级,因此第n级只可能是从第n - 1级或n - 2级走上来的,也就是第n级台阶方案数为第n - 1级和n - 2级之和,(n),f(n - 2)和 f(n - 1),用三个变量来代替数组f的存储。这是一个动态滚动的过程,三个变量在不断变化之中,此处理解建议多花费时间,可以看出,它只与第n - 1级和n - 2级有关,因此可以设置三个变量。对dfs进行优化,用一个数组 f 来存储第n个台阶时的方案数。要想解决跳台阶问题,最重要的是理解递归条件。
2024-03-18 09:38:15 476
原创 动态规划入门:从暴力dfs到dp
由题可知,一个数字只可以走到他下面的两个数,而在数组中该数下标(x,y),则它可以遍历的数字下标为(x + 1,y)和(x + 1,y + 1),要找到最大的权值,因此递归条件为。递推,也就是从已知答案的小问题逐步推演到源问题的过程,也就是从递归搜索树的下面走到上面回溯的过程,而此过程往往用数组来存储值。,“递”是从上往下,将问题分解为子问题的过程,“归”是从下向上回溯,将已有答案的子问题合并产生答案的过程,而dp就是只调用“归”,从下向上直接找答案。,而这取决于递归搜索树的底部是n还是0。
2024-03-17 18:03:21 851
原创 4-飞机降落
在确认当前飞机能降落后,该飞机降落结束的时间为( 降落时间 + 降落持续时间l),而降落的具体时间应该是t和time的最大值。下一架飞机降落时间在t ~ t + d,之内,因此要使time一定要在t + d之前,也就是t + d > time。每个飞机都有指定的开始降落时间t,最晚降落时间d,和降落所需要时间l,给定一组飞机,看这组飞机能否顺利降落。因为涉及到多个飞机谁先降落的问题,且本题数据大小只有几十,优先考虑暴力,也就是dfs。当所有飞机都降落时停止递归,因此。本题要把所有飞机都降落,所以是。
2024-03-16 22:22:03 408
原创 洛谷 P2036 [COCI2008-2009 #2] PERKET
本题为指数型dfs,且每个数都是有选和不选两个选择,因此无需用到for循环和vis数组,直接进行选和不选两个dfs即可,注意剪枝。给几种调料的酸度和苦度,将其加入食物中,求最小的酸度和苦度差。
2024-03-16 18:25:12 375
原创 洛谷 P1149 [NOIP2008 提高组] 火柴棒等式
给定n个火柴棒,将火柴棒排成数字a、b、c,使得a+b=c,且这n个火柴棒要用完,求可以摆成几种情况。仍然为dfs应用,且为指数型,建立数组用于分别存储abc,重要的是进行多次剪枝,使得运行结果不超时。
2024-03-16 17:56:28 404
原创 1.日期统计
首先用一个days[13]数组来存储每个月有几天,然后遍历每个月的每一天,将这一天存储到一个数组中,然后对数组进行遍历,找到和这一天的数组一样的数,找到了则ans++,并进入下一天。
2024-03-12 15:36:34 387 1
原创 PAT A-1144 The Missing Number
这题和柳神思路一样~我也用到了map,不过我的是int,bool型。找到最小的正数,该正数不在给定的数字列里。
2024-03-08 15:37:38 349 1
原创 PAT A-1143 Lowest Common Ancestor
本题中,要寻找BST中的最小共同祖先,要先了解BST的规律,即左子树<根,右子树>根,即输入的u,v的共同祖先一定大于一个数,小于一个数,且满足该条件时,最小的祖先即要求的结果。同时,也存在一个结点为另一结点的祖先的情况,因此也要加上此判定条件。看到这题我习惯性的开始建树,但是建树过程中遇到了些问题,看了柳神的代码,学到了新的思路。看到树、图题时,不要第一反应就是去建立模型,而是通过寻找数之间的规律,找到简便的做法。给定BST(二叉平衡树)的先序遍历,寻找输入的两点的最小共同父节点。
2024-03-08 15:18:49 363 1
原创 PAT A-1142 Maximal Clique
先判断是否为clique,在判断是否为maximal。给定clique的定义,判断给出的点集是否满足要求。
2024-03-08 11:47:08 347 1
原创 PAT A-1141 PAT Ranking of Institutions
给定一些学生的考试成绩,通过给定的成绩计算方式来对院校进行排名。成绩计算时有浮点数,如果直接用int类型存储会导致部分数据有偏差。但是一直后三个测试点一直不通过,看了柳神的博客发现是因为。(这谁想得到啊也太偏了)
2024-03-07 20:55:18 347
原创 PAT A-1138 Postorder Traversal
本题不需要重构树,只需要用到递归进行模拟树。给定先序和中序遍历,求出后序遍历的第一位。
2024-03-02 12:27:09 362 1
原创 PAT A-1136 A Delayed Palindrome
给定一个数字a,如该数不是回文数,则将a翻转得到b,判断a+b是否为回文数,如果不是则再次执行翻转并相加,直到结果为回文数,如果十次后得不到回文数则结束。(因为题中给出数字<=1000digits)
2024-03-01 17:55:31 365 1
原创 PAT A-1133 Splitting A Linked List
给定一个链表和数值k,先输出负数,然后输出<=k的数,然后是大于k的。本题采用静态链表存储,注意需要检查链表是否有垃圾结点。
2024-02-25 20:15:13 331
原创 PAT A-1132 Cut Integer
给定一个整数num,将它从中间切开,得两个数a和b,如num可以整除a*b,则输出Yes。,浮点错误是指出现了除以0或取余0的情况,因此需提前检测。
2024-02-25 18:48:35 374
原创 PAT A-1131 Subway Map
本题是多源求最短路径问题,本来想着是用floyd,但是本题为系数图·用矩阵存储特别不方便,因此采用邻接矩阵存储,用直接用dfs列举所有情况进行剪枝,给一个地铁地图,求从一地到另一地如何乘车所经站最少,如有多条路线则找转乘次数少的那条路。本题未通过所有测试案例(22/30),希望有大佬能解答。
2024-02-25 16:26:03 370
原创 PAT A-1087 All Roads Lead to Romea
仍为Djisktra应用,本题我用Djikstra求出所有的最短路径,然后用dfs对所有最短路径进行判断,但是不知道哪里出问题了,一直后面的样例没法通过。求解从起点到Rome,花费最少且幸福值(即点权)最高的路。本题未通过所有测试案例(15/30),希望有大佬能解答。
2024-02-17 18:47:35 366 1
空空如也
PTA 一元多项式的乘法与加法运算 不知道哪里错了
2023-04-06
TA创建的收藏夹 TA关注的收藏夹
TA关注的人