- 博客(17)
- 收藏
- 关注
原创 关于弗洛伊德算法的思考(C++)
也就是如果是间接相连路径更短,则在这两点之间,必存在使其最短距离更优的中间点,这意味着什么呢,我们通过起点到中间点的距离+中间点到终点的距离这个值和两点原来的距离比较一下,就能得到更优的了。2.最后一次以某中间点更新两点间最短路径时,起点到中间点和中间点到起点的最短路径间都不可能包含需要由中间点更新的最短路径,否则,这两点的最短路径就不需要看需要中间点为子最短路径中间点更新距离的m2这个中间点了,如图。2.以全图n个中间点更新一次最短距离,可以保证任意两点的中间点都选取更新过。
2024-05-27 17:46:14
593
原创 DFS深度优先遍历算法练后反思(C++)
也就是对于语句1与语句2之间循环的每一个DFS,都共用语句1和语句2,先语句1,然后把DFS看做一个已经封装好的解决好的相同子问题的答案,再结合语句2得到最终结果。不过这里要注意全局变量和函数内定义的变量的不同,全局变量在递归入栈时改变了,退栈时不会自动还原,需要手动还原,如这里的语句2:tempPath.pop_back();总而言之,假设调用一次DFS()我们就完成了我们需要的DFS的功能即可,在调用DFS()前后,我们只需实现一次DFS的功能,就能将全局问题利用递归分解为子问题层层解决。
2024-05-26 14:03:52
647
原创 迪杰斯特拉算法反思(C++)
如在一个图(无向图或者有向图)中求解从一点s到其他各点的最短路径时,就可以先看从该点直接可达的点之间的距离,选择距离最近的点,设为t1。(前面已经说过t1是直接可达的点里最近的点了,不妨假设一个中间点u,从s到u再到t1可达,那么从s到u就已经大于等于前面直接从s到t1的距离了,何况还要再加上一个u到t1的距离(非负)。因此,t1是确定的一个s到t1的最短距离的点了)然后以t1为中间点去更新其他还未确定最短路径的点,接着选取距离最短的点,依次类推...直到确定从源点达到所有点的最短路径。
2024-05-25 19:29:43
434
原创 算法训练总结(C++)
我发现有些时候,出现答案错误、运行时错误、运行超时等很多时候并不是我没有正确的思路和算法思想,特别是对于一些简单、中等难度的题,很多时候都是因为一些小毛病或者细节上的错误导致答案错误,结果出现较大偏差。,比如i,j写完i代码的时候写j照抄成i,再比如temp1,temp2,写完temp1的代码段类比着写temp2时,容易照抄成temp1。,比如两个大整数乘法的结果位数最大为两个整数的位数和加1,如果两个100位的整数相乘,定义结果位数200,就会出错,至少应该定义为201位。,导致赋值失败,永远赋值成0。
2024-05-17 16:50:17
319
原创 数学问题思考总结(C++)
这两天学了《算法笔记》中的数学问题相关部分,加减乘除、分数、素数部分还好,一个小学学过,一个之前接触过比较多次,后面又学了大整数的加减乘除,感觉也还好,就是用字符串输入,然后存到数组里,逐位进位运算。再后来...later先说学了欧几里得算法,用来求最大公约数和最小公倍数。最大公约数嘛,证明我已经不太记得了,只记得gcd(a,b) = gcd(b,a%b)当前面那个参数为0时就返回1了。不对,这说得好乱啊,还是细细回忆一下先。首先,如何求最大公因数呢?6和4的最大公因数显然是2,4可以分解为质因子乘积2*2
2024-05-16 15:03:19
1509
原创 DP动态规划学后思考与总结(C++)
限重从w[i]开始,那么这就可以涵盖不能将物品i放入背包时就继承dp[i-1][j]的情况,而背包限重w[i] >= w[i]开始一直到maxWeight,更新前i种物品的最大价值为max(dp[i-1][j],dp[i-1][j-w[i]]),思考当j增大到2倍w[i]时,其实这时就实现了继续添加物品i,同理在不大于背包限重的情况下j增到任意倍w[i],就实现了计算添加任意个物品i的最大价值;对于DP问题,我只能说,一个字,秒,两个字,精妙,三个字,太精妙,六个字,精妙得不得了。
2024-05-15 16:32:49
1642
原创 STL容器小结:vector,set,string,map(C++)
另一种是删除指定位置地原宿,使用erase函数,即erase(it)。(set和map内部是使用红黑树实现的(一种自平衡二叉树所有一般查找操作vector和string时间复杂度为O(n)时,set和map时间复杂度可能为O(logn),而借助迭代器的插入删除操作的时间复杂度则为O(1)。string的查找主要有两种,一种是知道子串内容查找下标,使用find(str),返回子串第一次出现时的下标,失配时返回string::npos(只需要知道它是一个常数,对应int型的-1,对应无符号整数的最大值即可)。
2024-05-11 19:00:45
776
1
原创 算法训练总结(C++)
(其中rand()生成[0,RAND_MAX]范围的整数,当区间差比RAND_MAX小时,rand()%(right-left +1)生成[0,right-left]范围的整数,注意如果区间差比RAND_MAX大,rand()%(right-left +1)就只能生成[0,RAND_MAX]范围的整数)下面和大家分享一下最近算法学习的收获顺便帮助自己回顾一下(虽然这可能才是主要目的qaq),共勉!只要待排数组元素个数大于1,就选择元素确定最终位置,再对该位置左右区间递归选择元素确定最终位置。
2024-05-06 18:38:10
287
原创 浅谈二分算法(C++)
任意两个有交集的区间如果一个区间左端点值大,则选取该区间左端点作为一个点一定可以将两个区间都覆盖。如果一个左端点值最大的区间与任何区间都没有交集,那么要保证所有区间都被覆盖,也必须从该区间选取一个点。从而通过上述分析可以发现,依次从左端点值从大到小选取区间不会选到多余的点,从而推至全局选取的点最少。1.在确定含所有解的初始区间时,有时涉及边界特殊值,我会手足无措,不知道如何处理。2.在条件情况更复杂的情况下,我不知道如何分类讨论,如何逼近正解。当然,只按右端点由小到大排序,然后依次选取右端点也可以。
2024-05-04 21:58:03
321
1
原创 贪心算法总结(C++)
其中代码的核心逻辑是排序策略,是先由左端点值由大到小排序,再由右端点由小到大,(这里不知道为什么我试了一下再由右端点由大到小排序也能完美通过,我先把这个问题放在这里思考一下,可能也可以,也可能是数据不全面),而不是先由右端点值排序(虽然只是简单的两行代码写错,但写对了就是满分,写错了可能就是0分或碰巧对几组数据20分左右,差距挺大的)。好吧,到现在我还没看出来我哪里错了,先放在这里,以后再回过头来研究。在这里,我想提炼一下精华。题目:给定𝑛个可能含有前导0的数字串,将它们按任意顺序拼接,使生成的整数最小。
2024-05-02 23:34:14
558
1
原创 用递归实现枚举(C++)
然后,不含1的数对又可以分为不含1且含2的数对,不含1且不含2的数对。然后,不含1且不含2的数对又可以分为不含1且不含2且含3的数对和不含1且不含2且不含3的数对...依次类推直到无法再细分。这里我们既然已经知道了所有组成方案的数字范围一定是在1~n-1,那么我们就可以将所有方案分为<1>含1且由不大于1的数组成的方案;如图,这一块包含所有方案的蛋糕,我们随便怎么切都可以,但是我们要明确我们的目的,就是切了之后,我们要能找到我们切开的每块小蛋糕,如图中的1,2,3,4,5,6,7。不允许出现相同的子集。
2024-05-01 00:39:51
849
原创 棋盘覆盖问题(C++分治思想强化)
分治,分治,即分而治之。没错,2^(k+1) * 2^(k+1)棋盘可以分割为四个2^k * 2^k棋盘,换言之,2^(k+1) * 2^(k+1)棋盘中有四个2^k * 2^k棋盘。如果要将该问题的规模缩小,也就是说要将该问题分解,那么我们将原规模的问题分解出规模更小的原问题。把棋盘方格用一个二维数组表达出来,然后按x从小到大,y从下到大的顺序依次把方格用四种骨牌覆盖方法覆盖,再把已覆盖的方格的二维数组对应值设为true,但是我发现这种方式压根无法推进,也无法判断怎么覆盖一定有解。//还不知道我要写啥。
2024-04-29 23:55:39
665
1
原创 递归手段总结(C++)
题目如下:有三根柱子A、B、C,初始时,A柱子套了若干圆盘,其中圆盘大小互不相同,且柱子由下到上对应圆盘由大到小,B、C柱子是空的,现在要把A柱子上套的圆盘全部移到C柱子上,每次移动圆盘只能将柱子最上面的圆盘套到另一个柱子最上面,要求无论是移的过程中还是最终状态所有柱子上的圆盘都要保持下面的圆盘比上面的圆盘大。当A套有两个圆盘时,我们得先把大的圆盘套到C上,而A上还有一个小的圆盘,因此我们需要先把小圆盘套到B上(第一步),然后才能直接将大圆盘套到C上(第二步),此时再将B上的小圆盘套到C上(第三步)即可。
2024-04-29 02:01:50
1460
1
原创 散列问题总结以及变量命名技巧(C++)
假设两个集合和一个布尔型散列数组(初始化全为false),先将第一个集合中的元素逐个在对应散列数组中设置值为true,在遍历第二个集合中的元素时,逐个检查当前访问的元素对应的散列数组中的值,若为true,则输出到交集中。此法虽好,不过值得注意的是,不同字符较多时,这种散列方法只能支持较少字符数的字符串,比如说二十六进制情况下,26的7次方已经达到了80亿,超出了int能表示的范围,int能表示的范围大概在20亿左右,因此用这种散列函数构造法,使用int大小的数组,只能查找不超过6位的纯大写字母串)。
2024-04-27 23:37:39
488
原创 排序问题总结(C++)
建议大家不要学我,可以一开始就要计算机的计算步骤简单模拟一下计算过程,如需要什么循环呀,循环里面要嵌套什么if语句或者嵌套循环之类的,以及需要哪些辅助变量,这一点很重要,最好写一个功能代码块之前就把需要用到的辅助变量定义好,而且最好把变量名写成有助于思考,让逻辑看起来更清晰的名字,而不是什么i,j,k之类的,我也是饱尝了一循环就用i,j,k的苦。,有两个参数,该函数用于定义排序规则。以上排序思想很简单,但是实际考查更复杂的问题时,我们需要学会灵活运用上面的基本知识,使用更复杂的逻辑组合来解决具体的问题。
2024-04-27 02:05:05
545
原创 进制转换总结(C++)
输出的话,我们选择一个字符数组或者整型数组(比如十六进制涉及‘A','B','C','D','E','F'可以使用字符数组,当然也可以选择使用整型数组先存储,等到输出时再将整数输出为对应的A,B,C,D,E,F即可,而二进制则只涉及0,1,可以使用整型数组)。需要知道0~9数字的ASCII码是连续的,A~Z大写字母的ASCII码是连续的, a~z小写字母的ASCII码是连续的。后面输出就将非'\0'输出即可。} //************有更好的写法。//*****************有更好的写法。
2024-04-24 16:57:12
726
原创 超出int范围易错点(C++)
利用计算机的高速计算,只有每一次都能得到正确答案,那么无论计算多少次,它都能给你最终的正确答案。(不像我们手动计算,步骤多了,就容易算错)。每次累乘后都先取模,不然累乘的最终结果会非常大,取模就会将这个结果减少至模的范围内。(如本题,模数为1007,取模就是减至0-1006范围内)。其中注释了***的行为核心计算过程,算错了。原因根据我的分析是:2的33次方就已经超出int范围了,不能一次得出结果,导致最终结果也不对。跟着《算法笔记》这本书练习C++机试以来,感觉收获很大,这是《算法笔记》中的一道练习题。
2024-04-23 17:07:13
462
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人