![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++和算法
文章平均质量分 67
再学5分钟
这个作者很懒,什么都没留下…
展开
-
状态压缩动态规划
什么是状态压缩动态规划状态压缩动态规划可以简单粗暴地分为两个步骤:状态压缩状态压缩就是利用二进制数只含0和1的特点来表示是否选择某一项的方法。比如有3个小球,编号分别为1、2、3,那么选择的方案就有:000,001,010,011,100,101,110,111这8种。我们很容易发现它们在十进制中是连续的,并且最大值为2^n - 1。这使得我们能够很容易地表示各种选择的状态并遍历它们。动态规划此时,再根据状态压缩的前提,定义合适的dp数组并找到状态转移方程,就是我们熟悉的dp操作了。注:重原创 2021-08-30 12:32:17 · 1066 阅读 · 0 评论 -
数组名和数组名取址的区别
数组名arr和数组名&arr取址的区别今天无意中看到的问题,先输出看看:int arr[5] = { 1,2,3,4,5 };cout << arr << endl;cout << &arr << endl;cout << arr + 1 << endl;cout << &arr + 1 << endl;可以看到它们输出的地址相同,但是对两个地址进行+1操作后得到的结果却原创 2021-05-04 13:49:53 · 211 阅读 · 0 评论 -
并查集
并查集并查集的全称是合并-查找集合,顾名思义它的主要功能就是合并查找。合并:合并两个不相交的集合;查找:查找两个元素是否在同一个集合中。并查集是一个集合,但是其逻辑上的结构却类似一个树,主要表现为:每一个元素都对应着一个parent结点。我们查找的实质,就是查找元素对应的根结点;合并的操作,也是对被合并的集合元素的根进行修改。(在实际操作中,我们会让parent直接对应根结点,后文在“路径压缩”中会讲到)但是在实际操作中,我们只需要把parent值存在数组中,只要做到“心中有树”即可。我们用一个简原创 2021-04-23 18:37:06 · 150 阅读 · 0 评论 -
KMP算法
KMP算法KMP算法是用于解决字符串匹配的经典算法,就是判断一个字符串是否是另一个字符串的子串。例如现在我们有两个字符串,字符串s: "aabaabaaf"和字符串t: “aabaaf”,我们该如何判断字符串t是否是字符串s的一个子串呢?如果使用暴力匹配,即两个for循环,暴力的时间复杂度是两个字符串长度的乘积。而KMP算法有什么不同呢:就比如字符串s和t的匹配中,当我们匹配到第六个字符时,发现b和f并不匹配,此时按照暴力法我们应该将s的下标+1,继续从t的开头开始匹配;但是如果是KMP算法,就会保原创 2021-04-23 18:36:10 · 85 阅读 · 0 评论 -
01背包(动态规划解法)
01背包(动态规划解法)01背包是一个很经典的问题,题目如下:有n件物品和一个最多能装重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,问怎样装载能使背包里物品的价值最大。这里我们用一组简单的数据来进行示例:假设背包最大容量为5物品重量价值物品0115物品1220物品2325物品3430它与普通背包的区别在于,每个物品要么放,要么不放,而普通背包是可以放一部分的,因而普通背包可以通原创 2021-04-23 18:35:07 · 2751 阅读 · 1 评论 -
二分法
二分法二分法的思想很简单,确定好上下界,取中间的数,看是否符合条件,若是则将下界更新为中间数后的一位。即每次循环都将当前范围分成两份,然后抛弃不符合题意的一半,显然它的时间复杂度为O(log 2n) 。它适用于较长的数组,并且数组元素必须是排好序的。比如给出一个数组array[10]={1,2,3,4,5,6,7,8,9,10};查找数组中是否含有8,是则输出“Yes”,否则输出“No”。首先它是排好序的,符合条件,我们使用二分法:定义上下界分别为10和1,中间数为(1+10)/2=5,5<8原创 2021-04-23 18:29:12 · 258 阅读 · 0 评论 -
快速幂
快速幂快速幂的主要作用是求ab对mod取模,尤其适合于指数b和mod很大的情况,它的原理也十分简单,我们举一个简单的例子:210%100如果用循环乘法来实现,一共要执行10次乘法,然后再对100取余数;而快速幂的思想则是减少执行的次数,把210变成(2*2)5,这样做的好处是用一次底数的平方,减少了一半的执行量,指数b越大,减少的操作越多。我们继续,45还能不能继续这样变换呢?当然可以,但是因为5是奇数,我们不能将它直接除以2,但是可以提出一个41,这样我们又可以对剩下的44进行操作了,一直继续下去原创 2021-04-23 18:27:44 · 135 阅读 · 0 评论 -
动态规划
什么是动态规划我们首先看一下递归求斐波那契数列的函数:int fib(int n){ if(n==1||n==2) return 1; else return fib(n-1)+fib(n-2);}假设我们输入的参数是5,那么求解过程为:会发现其中有重复的计算,如fib(3)就算了两次,如果我们将规模扩大,那么重复的计算会更多。为了避免重复计算,我们可以创建一个全局数组,存储fib(n)的值,当需要fib(n)时,可直接参与运算,而不需要再次递原创 2021-04-23 18:30:54 · 272 阅读 · 0 评论