Acwing 算法题题解
Acwing 算法题题解
小王要变强
这个作者很懒,什么都没留下…
展开
-
Acwing 171.送礼物
思路:因为此题w的范围为[1,2^31-1],故不能用背包去解,因为1<=m<=46,可以想到用dfs,但一般的dfs肯定会超,所以想到可以用双向dfs,先搜前一半,打个表,把所有的情况都列出来,再搜后一半,当搜到第m个时,再利用二分去表中查找第一个<=(w-当前后一半的重量),记录下最优解。有m个礼物,给定每个礼物的重量,在重量不超过w的情况下,求最大的重量。算法标签:双向dfs。原创 2023-10-16 13:42:10 · 100 阅读 · 1 评论 -
Acwing 180.排书
被题的难点就是找估价函数,因为每次最多会断开三个相连的位置,所以每次最多会将三个错误的位置修正(每次都要算出改状态的错误位置有几个),假设当前有tot个错误链接,则最少需要tot/3(上取整)次操作,所以估计函数f()=tot/3(上取整)=(tot+2)/3(下取整)。给定一个1~n的随机序列,每次操作可以任选一段序列移出来放到某个位置的后面,如果能在4步操作之内把该序列变成1~n的升序则输出操作步数,否则输出“5 or more”原创 2023-10-16 14:50:53 · 102 阅读 · 1 评论 -
Acwing 170.加成序列
思路:因为涉及到了最短,如果用普通dfs的话,则需要把整颗搜索数都遍历一遍,因为不知道当前解是否最优,当然可以加一些剪枝,但是它的效率还是不如迭代加深,故用迭代加深去解,迭代加深就是给定一个深度限制的dfs,具体看代码注释。题目大意:已知一个序列的开头(一定为1),结尾(输入),序列的中的每一个数都是该数之前的任意两个数相加(可以是同一个数),并且保证序列严格单调递增,求该序列长度最短的解,并输出序列中所有的数(有多组解的话任意输出一组)原创 2023-10-16 13:10:30 · 104 阅读 · 1 评论 -
Acwing 165.小猫爬山
思路:按体重从大到小枚举每只小猫(优化搜索顺序),每只小猫有两种选择,可以选则加入之前的缆车,如果可以加入的话(可行性剪枝),也可以选择自己额外开一辆缆车。当枚举到最后一只的时候,更新一下res,如果搜索过程中,当前缆车数量已经>=res,直接返回(最优性剪枝)我的理解是:如果先搜大的,后面就只能搜小的,如果先搜小的话,后面即可以搜大的也可以搜小的,这样搜分支显然比先搜大的多很多,所以先搜大的能够优化搜索。题目大意:已知一辆缆车的最大承受重量和m只猫的重量,求最少需要多少量缆车。原创 2023-10-16 11:12:11 · 113 阅读 · 1 评论 -
Acwing 1117. 单词接龙
题意:给定m(m<20)个字符串,如果一个字符串是另一个字符串的非平凡后缀,则可以将此字符串连接在另一个字符串的后面,公用重叠的部分,这个新的字符串称之为“龙”,求龙的最长长度,每个字符串可用两次。link[i][j]=len表示第i个字符串与第j个字符串有公共部分,长度为len。其中第一个参数表示当前的“龙”,第二个参数表示上一个字符串的下标。预处理完后,dfs首字母为所给字母的字符串,结果取max。思路:由于m<20,所以很容易想到暴搜。原创 2023-10-09 23:57:04 · 60 阅读 · 2 评论