算法
davidyoyoh
这个作者很懒,什么都没留下…
展开
-
萌新做点小玩意儿DAY-14 0-1背包问题之圣诞老人送礼物
用到贪心算法的最最最标准的例题就是0-1背包问题,选择一个最优的贪心策略决定了算法是否能找到最优解,在0-1背包问题中的贪心策略有:最大价值优先,最小重量优先,最大单位价值优先的策略,这样也就决定了贪心算法不能保证一定能够找到最优解,而0-1背包问题采取最大单位价值优先的策略时,是可以得到最优解的。因此我们需要证明是否我们的贪心选择可以达到最优。问题描述:圣诞节来了,圣诞老人给孩子们送礼物,现在有很多箱不同的礼物,每箱有自己的价值和重量,每箱都可以拆分成散装带走,圣诞老人的雪橇可以携带重量为W的礼物,请原创 2020-07-11 11:26:56 · 222 阅读 · 0 评论 -
萌新做点小玩意儿DAY-13 DFS解决城堡问题
城堡问题是一个典型的可以用DFS来解决的地图问题,跟之前的面积问题一样,地图类问题都少不了方向向量,因为问题描述比较复杂从问题描述来考虑算法的思路。城堡问题可以算是面积问题的一个基础问题,解决起来比较轻松而且适合接触刚DFS的新手来练手。问题描述:有一个城堡的地形图,如图所示,其中#表示墙不可跨越的区域,而---和—表示可以跨越的区域,墙体围成的每一个闭合区域称为一个房间,编写一个程序计算一共有多少个房间,最大的房间有多大。其中城堡被分割为MxN(M和N不大于50)个方块,每个方块可以有0-4面墙,原创 2020-07-10 14:16:05 · 144 阅读 · 0 评论 -
萌新做点小玩意儿DAY-12 DFS经典例题素数环
上一篇写的是BFS问题,今天解决了一道经典的DFS例题素数环。在我来看,DFS和BFS最大的区别就在D和B之间,以D优先就是从一个节点走到底,要么出解要么进死胡同,进了死胡同再回溯到最近的活结点换条路走到黑。以B优先就是同一层可以扩展的节点同时扩展。在解决平面问题比如数独问题和面积问题的时候使用BFS会相对好思考一些。问题描述:把从1到n这n个数摆成一个环,要求相邻的两个数之和为一个素数,1<=n<=20。输出一个素数环(两个数字间用空格隔开),要求输出字典序中最大的那一个。比如:输入:原创 2020-07-09 10:38:32 · 187 阅读 · 0 评论 -
萌新做点小玩意儿DAY-11 BFS解决面积问题
BFS广度优先搜索指的是在子集树中优先遍历同一层的所有节点,然后再深入遍历更深一层的节点,在地图类的问题中一般以某一层地图为初始节点同时扩展来遍历全图。问题描述:编程计算由*围成的下列图形的面积。面积的计算方法是统计*所围成的闭合曲线中的点的数目,如下图所示在10*10的二维数组中,有*围住了15个点,因此面积为15。(题目中以1代替*)算法思想:这是一个标准的BFS地图题,但是需要经过一步转化,无疑就是将图中的*围出来的0数出来,但是计算0的数量的时候,我们要先把不符合要求的0全部转化为1,如原创 2020-07-07 18:30:28 · 189 阅读 · 0 评论 -
萌新做点小玩意儿DAY-10 随机数算法计算π的值
Today I had a sudden whim to try that if I could write a blog with English. I chose a relatively simple question because I'm afraid I cannot describe it in detail.This topic is about the random number algorithm. We all clearly know that the obvious char.原创 2020-07-01 19:58:46 · 265 阅读 · 0 评论 -
萌新做点小玩意儿DAY-9 利用队列式分支限界解决抓住那头牛问题
回溯法采用的是是深度优先搜索的策略,一般被用在找到一个问题的所有解。但是当问题只需要找到一个最优解的时候,可以使用分支限界的算法思想。分支限界算法思想就是以广度优先的策略对解空间树进行遍历,每个活结点只有一次机会成为拓展节点,跟分支限界法搭配使用的数据结构最常见的就是先进先出后进后出的队列。问题描述:农夫知道一头牛的位置,想要抓住它,农夫和牛都位于数轴上,农夫起始点是N(0<=N<=100000),牛位于点K(0<=N<=100000)。农夫有两种移动方式,1.从X移动到X+1或原创 2020-06-28 15:57:44 · 253 阅读 · 0 评论 -
萌新做点小玩意儿DAY-8 逐步优化数字三角形算法
前两天的回溯法的问题都是使用递归解决的,但是有的时候问题规模比较大的时候递归回溯的时间复杂度过高,以指数的形式的增长,例如今天的数字三角形的问题。所以如何优化递归使之转化为递推迭代就至为重要。问题描述:在类似于下图中的数字三角形中寻找一条从顶部到底部的路径,使得路径上经过的数字之和最大。路径上每一步只能往左下或者右下走。求出这个最大的和,其中三角形的行数大于1小于100,数字为0-99。递归思想:用二维数组存放数字三角形,n表示三角形行数,x[i][j]表示第i行第j个数字,Maxsum(i,j原创 2020-06-27 16:41:19 · 231 阅读 · 0 评论 -
萌新做点小玩意儿DAY-7 回溯法解决字符序列问题
今天继续使用回溯法来解决一个新的题目,跟N后问题还有素数环相似都很简单,都是填空判断递归回溯。问题介绍:从三个元素的集合【A,B,C】中选取元素生成一个N个字符组成的序列,使得没有两个相邻字的子序列(子序列长度=2)相同。例如:N=5时,ABCBA,ABCAB是合格的,而ABABC,ABCBC不是合格的,因为AB和BC子序列是相同的。求对于输入的N,输出的所有满足条件的字符序列。算法思想:跟N后问题极其类似,先建立一个字符数组a[]表示字符序列,第一个字符依次填入ABC后进行深度优先的搜索,根据原创 2020-06-26 17:25:28 · 221 阅读 · 0 评论 -
萌新做点小玩意儿DAY-6 回溯法解决N后问题
回溯法是一种能解决百分之九十九的问题的一种通用的算法思想,在问题的解空间树中,按深度优先策略对整个解空间树进行搜索,当算法搜索到某一个节点如果不包含问题的解则会直接跳过对这个子树的搜索回溯到这个节点的根节点,继续深度优先搜索。回溯法几个重要的名词:活结点,拓展节点,死节点,约束函数,限界函数。活结点,拓展节点,死节点:从一个节点出发搜索的时候,这个节点就是活结点,同时也会成为拓展节点,在拓展节点搜索到新的节点时就会成为新的活结点并且进行拓展,当拓展节点不能进行纵深方向移动的时候就会成为死节点。回溯法原创 2020-06-24 18:40:42 · 378 阅读 · 0 评论 -
萌新做点小玩意儿DAY-5 贪心算法解决活动安排问题
当一个问题有最优解结构的性质时候,可以用昨天提到的动态规划算法来解决,但是有时候问题满足一定的条件的时候可以用更为简单的贪心算法的思想来解决,这个条件也就是具有贪心选择的性质——所求问题的整体最优解可以通过一系列局部最优选择来达到,而找出局部最优解的方法是通过定义这个问题的贪婪准则。一个比较形象的例子就是找零钱如何找最少数目的钞票的问题,收银员要找给顾客89元,他会优先选择满足需求的最大面额的钞票也就是50元的,然后剩下的39元再依次优先选择20元,10元,5元,四张一元的钞票。这实际上就是一个贪心算法。在原创 2020-06-21 20:17:46 · 513 阅读 · 0 评论 -
萌新做点小玩意儿DAY-4 动态规划解决多边形游戏
还是先简单的介绍一下动态规划的算法思想,跟分治法的思想相似的是把一个比较大的问题分解成若干子问题,而分治法分解出来的子问题都是相同规模有相同的解决办法的,动态规划可以通过空间换时间来解决这些相同的问题,比如说我们计算10的4次方的问题,可以分解为10^2*10^2,我们计算出了第一个10的方时可以把答案记录下来再计算到第二个10的方时,直接调用就好了。因此,动态规划算法适合解决的问题有以下特点:1.最优子结构性质(也就是说当问题分解的时候无论怎么分解,由主问题的最优性总能推出子问题的最优性)2.原创 2020-06-20 18:08:49 · 1273 阅读 · 0 评论 -
萌新做点小玩意儿DAY-3 运用递归和分治的棋盘覆盖算法
今天复习了一下很久很久前学过的分治和递归算法思想。分治顾名思义分而治之,当面对一个规模比较大的问题时,暴力解决问题则会面临庞大的计算量,因此并不妥当,我们可以把一个大的问题转换为规模相同的子问题,通过调用解决子问题的算法来解决整个问题。在我看来递归并不是一种算法而是解决问题的一种思想,最常见的递归计算就是计算n!和斐波那契数列,递归的特点就是代码实现起来比较快捷,短短的几行代码就可以计算解决斐波那契数列问题。而非递归的方式则要实现一个很复杂很复杂的函数。int Fibonacci(int n)原创 2020-06-19 17:20:38 · 1216 阅读 · 0 评论