- 博客(15)
- 收藏
- 关注
原创 求最长公共子序列<洛谷>
我们不妨给它们重新标个号:把3标成a,把2标成b,把1标成c……两个序列的子序列,一定是A的子序列。而A本身就是单调递增的。这样标号之后,LCS长度显然不会改变。换句话说,只要这个子序列在B中单调递增,它就是A的子序列。关于为什么可以转化成LIS问题,这里提供一个解释。当然是B的LIS最长。因此这个子序列是单调递增的。
2023-10-08 18:07:24 60 1
原创 最长公共子序列
b[j]且a[i]、b[j]均不在公共序列中,这种情况可以看成是第二第三情况的任意一种。//设f[i][j]表示序列a[1....i]和b[1....j]的最长公共子序列长度。=b[j],且a[i]不在公共子序列中,则可去掉a[i]=b[j],且b[j]不在公共序列中,则可去掉b[j]//(1)若a[i]=b[j],则a[i]与b[j]在公共子序列中。//所以f[i][j]=f[i-1][j-1]+1。//所以f[i][j]=f[i-1][j]//所以f[i][j]=f[i][j-1]
2023-10-07 14:36:11 48 1
原创 最长上升子序列之二分优化
if(a[i]>b[len])//大于则添加。//值得注意的是b数组存储的不是最长上升子序列。int b[101];//有序子序列的长度。else//小于则替换。//最长上升子序列之二分优化。
2023-10-07 14:13:29 71 1
原创 ACWING小猫爬山
一道基础的dfs剪枝优化,我做了好半天做不出来,其实就是明白题的意思,代码呼之欲出就是写不出来,最后写出来还TLE了。总之就是感觉自己太菜了,写篇题解纪念一下。我掉入了暴力的陷阱,有些现成的条件没用上,只想着去开辟新的空间。灼烧手指,是对我无力的惩罚。
2023-09-25 00:04:56 40 2
原创 爬虫爬取B站某up是否含有另一些up的程序
您好,我刚才给您的代码里的base_url是一个变量,它的值是一个字符串,表示一个网址的最主要的部分。例如,如果up主的uid是19873195,页码是1,那么粉丝列表的url就是`https://api.bilibili.com/x/relation/followers?在Python中,有一个模块叫urllib.parse,它提供了一些函数来解析和组合网址,其中就有一个函数叫urlparse,可以用来从一个网址中提取出base_url。# 定义一个函数,根据up主的uid和页码,获取粉丝列表的url。
2023-09-23 22:35:33 162 1
原创 爬虫爬取4399上所有的火柴人游戏(仅供娱乐)
这段代码里的a_tag[]是用来表示一个a标签的属性或内容的一种写法。- a_tag["href"],表示访问这个a标签的href属性的值,结果是"https://www.bing.com"- a_tag["title"],表示访问这个a标签的title属性的值,结果是"Bing Search Engine"- class="link",表示这个链接属于一个叫做"link"的样式类,可以用CSS来设置这个类的样式。- a_tag["class"],表示访问这个a标签的class属性的值,结果是"link"
2023-09-23 22:32:47 125 1
原创 一个很强的二进制转换器bitset
bitset的常用函数:bitset类提供了一些常用的函数来获取或操作其状态,如count()返回1的个数,size()返回总位数,test(pos)返回某一位是否为1,any()返回是否有1,none()返回是否全为0,all()返回是否全为1,set()将所有位设为1或某一位设为指定值,reset()将所有位设为0或某一位设为0,flip()将所有位取反或某一位取反等。bitset的访问和修改:可以用下标运算符([])来访问或修改bitset对象的某一位,注意下标从0开始,且从低位到高位。
2023-09-23 17:39:49 108 1
原创 很骚的二分(2)
二分插入排序是一种改进的插入排序算法,它的基本思想是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到找到合适的位置插入第i个元素。这样可以减少比较次数,提高排序效率。然后,将排好序的左右两部分合并成一个新的有序数组,方法是使用两个指针分别指向左右两部分的起始位置,比较指针所指向的元素的大小,将较小的元素放入新数组中,并移动指针到下一个位置,直到某一部分全部放入新数组中,再将另一部分剩余的元素依次放入新数组中。
2023-09-22 09:18:54 35 1
原创 很骚的二分
你可以想象一下,如果有一个子段的平均值是10,而另一个子段的平均值是9,那么我们只需要知道存在一个平均值为10的子段就可以了,因为它已经比9大了。题解代码使用的是迭代法,它用两个变量l和r表示当前的搜索区间,然后用一个while循环不断更新l和r的值,直到l和r相遇或者相差很小(小于1e-5)。这是因为题目要求输出的结果是保留三位小数的整数2,而r的值总是比l的值大一点点(因为更新l时用的是l = mid而不是l = mid + 1),所以打印r可以保证不会丢失精度。为什么最后返回的是r而不是mid?
2023-09-22 08:51:28 44 1
原创 可达性统计
从前往后递推的时候,我们需要先计算出每个点的所有前驱点,也就是能够到达这个点的点的集合,然后对于每个点,我们需要遍历它的所有前驱点,把它们能够到达的点的集合按位或起来,得到这个点能够到达的点的集合。而从后往前递推的时候,我们不需要计算每个点的所有前驱点,只需要按照拓扑序列的逆序来遍历每个点,然后对于每个点,我们只需要遍历它的所有后继点,也就是它能够到达的点的集合,把它们按位或起来,得到这个点能够到达的点的集合。// j这个点可以到达自己 f[j][j] =表示从 j出发的点,
2023-09-21 19:24:37 54 2
原创 关于状压dp
比如f[2][1]表示从集合{1}出发,以1为终点的最短距离,它是由f[2-(1<<1)][0]+w[0][1]得到的,即f[0][0]+w[0][1]。这个数组的每一个元素都是由状态转移方程来计算的,即f[i][j]=min(f[i-(1<<j)][k]+w[k][j]),其中k是任意一个在集合i中的点,w[k][j]是从k到j的距离。这个数组的最终目标是求出f[(1<<N)-1][N-1],即从集合{0,1,…f[i][j]=min(f[i][j],f[i-(1<<j)][k]+w[k][j]);
2023-09-17 18:22:22 52 2
原创 关于背包的问题
但是你仔细观察下,你便会发现,f[i][j]在状态转移时两种情况下第一维的转变总是一样的呢(i-1)->i,(ps:这里我抽象了一下下,方便理解),所以我们可以得到,第一维其实是没影响滴,我们通过从1到N的枚举遍历,从f[1]到f[2]到f[3]到....f[N-2]到f[N-1]到f[N],其实就是最大价值的不断递推,所以说既然我们已经遍历到N了,那么其实第一维的影响就没有了。k*v[i]<=j;那么就可以合并咯,f[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i])
2023-09-13 01:57:38 41 1
原创 bt字符串动态规划
这毫无疑问是最简单的情况吧,其他所有的复杂情况都拜倒在他的石榴裙下,因此可以此情况来添砖加瓦,构成一栋大厦。//dp[i][j]=dp[i-1][j-1] +1或+0 这要看他们第i位和第j位的字符是否相等了。//dp[i][j]是将含i个字符的A字符串转化为含j字符的B字符串所需要的最少步骤。//将含i-1个字符的A字符串进行转换成含j个字符的B字符串为dp[i-1][j]//易得dp[i][j]=dp[i-1][j]+1;//那么如果是dp[i-1][j-1]呢。//接下来是状态转移。
2023-05-17 00:10:55 84
原创 COW EXIBITION G(看完了会浪费时间的博客)
1.不知道背包容积,但是却创造了一个范围内的最大背包容量,然后从最小开始枚举进行状态转移。我看到了一份与众不同的题解,很是巧妙,感兴趣的童鞋可以亲自到洛谷去瞧瞧喔。3.还有就是,任何记忆化搜索都可以转换为状态转移?2.数组右移,巧妙地解决了数组下标为负数的越界问题。有几个值得我去学习的点.4.边界的初始化很重要。
2023-05-16 23:16:13 48
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人