
算法基础
-出发-
学生一个,正处于学习阶段,希望与大家多多交流
展开
-
5-求阶乘
现在进入递归的学习了,递归非常重要,使用的非常多。1、递归的基本概念一个函数调用其自身,就是递归。下面通过一个简单的例子来说明递归的过程。例子:求n!的递归函数n阶乘可以分解为n乘以n-1的阶乘问题,将问题分解为规模更小的子问题进行求解,用递归实现如下:int Factorial(int n){ if (n == 0) return 1; else return n * F...原创 2019-02-14 21:37:51 · 3489 阅读 · 0 评论 -
21-数字三角形(1)
从这里开始,我们要学点新东西啦,动态规划,仍然边说例子,边说思想,从案例中锻炼算法思想。例题:数字三角形题目描述在数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或右下走。只需要求出这个最大和即可,不必给出具体路径。三角形的行数大于1小于等于100,数字为0 - 99输入格式:5 //三角形行数。下面是三角形73 88 1 02...原创 2019-03-06 16:41:30 · 527 阅读 · 0 评论 -
18-快速排序
快速排序也是分治的典型应用1、任务分解数组排序任务可以如下完成:设k=a[0], 将k挪到适当位置,使得比k小的元素都在k左边,比k大的元素都在k右边,和k相等的,不关心在k左右出现均可(O(n)时间完成)把k左边的部分快速排序把k右边的部分快速排序2、快排过程下面使用实例来说明快速排序的过程。1、首先取第一个数作为参考节点,左侧下标在最左边,右侧下下标在最右边。2、右侧下...原创 2019-03-04 08:48:57 · 400 阅读 · 0 评论 -
26-最佳加法表达式
问题描述有一个由1…9组成的数字串.问如果将 m 个加号插入到这个数字串中,在各种可能形成的表达式中,值最小的那个表达式的值是多少。问题分析假定数字串长度是 n,添完加号后,表达式的最后一个加号添加在第 i 个数字后面,那么整个表达式的最小值,就等于在前 i 个数字中插入 m-1 个加号所能形成的最小值,加上第 i+1 到第 n 个数字所组成的数的值( i 从1开始算)。#include&...原创 2019-03-14 16:14:52 · 524 阅读 · 0 评论 -
22-数字三角形(2)
上文中使用递归来求解问题,这里我们将求解过程优化,如何优化,请继续向下看。递归转化为递推用一个全局数组保存结果,先将最后一行的数字放置到结果的最后一行,从倒数第二行到第一行逐层求解从i行j列元素到最后一行的路径中最大的值。数字三角形为:73 88 1 02 7 4 44 5 2 6 5求解过程如下:将数字三角形最后一行复制到全局变量最后一行,第四行第一列元素2到最后一行的路径最...原创 2019-03-09 23:03:38 · 582 阅读 · 0 评论 -
23-动态规划解题一般思路
前面的讲解了数字三角形问题,这里整理一下使用动态规划解题的一般思路1、将原问题分解为子问题把原问题分解为若干个子问题,子问题和原问题形式相同或类似,只不过规模变小了。子问题都解决,原问题即解决(数字三角形例)。子问题的解一旦求出就会被保存,所以每个子问题只需求解一次。2、确定状态在用动态规划解题时,我们往往将和子问题相关的各个变量的一组取值,称之为一个“状态”。一个“状态”对应于一...原创 2019-03-12 09:52:07 · 455 阅读 · 0 评论 -
24-最长上升子序列
前面看动规解题的一般思路比较抽象,通过一个实例来实际演练一下。问题描述例题:最长上升子序列一个数的序列 ai,当 a1 < a2 < … < aS 的时候,我们称这个序列是上升的。对于给定的一个序列(a1 , a2 , …, aN),我们可以得到一些上升的子序列(ai1 , ai2 , …, aiK ),这里1 <= i1 &a原创 2019-03-12 17:41:36 · 283 阅读 · 0 评论 -
25-最长公共子序列
问题描述:给出两个字符串,求出这样的一个最长的公共子序列的长度:子序列中的每个字符都能在两个原串中找到,而且每个字符的先后顺序和原串中的先后顺序一致。Sample Input:abcfbc abfcabprogramming contestabcd mnpSample Output:420问题分析:第一个案例中最长的公共子序列为abcb,第二个为on,第三个没有。前面说过动...原创 2019-03-13 11:38:17 · 392 阅读 · 0 评论 -
43-圣诞老人的礼物
问题描述圣诞节来临了,圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走。圣诞老人的驯鹿雪橇最多只能装下重量W的糖果。请问圣诞老人最多能带走多大价值的糖果。...原创 2019-04-05 00:47:13 · 815 阅读 · 0 评论 -
44-电影节
问题描述大学生电影节在北大举办 ! 这天,在北大各地放了多部电影,给定每部电影的放映时间区间,区间重叠的电影不可能同时看(端点可以重合),问李雷最多可以看多少部电影。输入:多组数据。每组数据开头是 n(n<=100),表示共 n 场电影。接下来 n 行,每行两个整数 (均小于 1000 ),表示一场电影的放映区间。n=0 则数据结束输出:对每组数据输出最多能看几部电影。Sampl...原创 2019-04-08 17:21:21 · 418 阅读 · 0 评论 -
45-分配畜栏(Stall Reservations)
问题描述有n头牛(1<=n<=50000)要挤奶。给定每头牛挤奶的时间区间[A,B] (1<=A<=B<=1000000,A,B 为整数)。牛需要呆畜栏里才能挤奶。一个畜栏同一时间只能容纳一头牛。问至少需要多少个畜栏,才能完成全部挤奶工作,以及每头牛都放哪个畜栏里(Special judged)去同一个畜栏的两头牛,它们挤奶时间区间哪怕只在端点重合也是不可以的。...原创 2019-04-09 16:04:23 · 658 阅读 · 2 评论 -
28-滑雪
问题描述Michael 喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael 想知道载一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子。1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 ...原创 2019-04-13 00:11:41 · 353 阅读 · 1 评论 -
29-神奇的口袋
问题描述有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有 n(1≤ n ≤ 20)个想要得到的物品,每个物品的体积分别是 a1,a2……an。John 可以从这些物品中选择一些,如果选出的物体的总体积是 40,那么利用这个神奇的口袋,John 就可以得到这些物品。现在的问题是,John 有多少种不同的选择物品的方式。也就是说从 a1,a2...原创 2019-04-13 16:33:34 · 539 阅读 · 0 评论 -
46-放置雷达(Radar Installation)
问题描述x 轴是海岸线,x 轴上方是海洋。海洋中有 n(1<=n<=1000) 个岛屿,可以看作点。给定每个岛屿的坐标 (x,y),x,y 都是整数。当一个雷达(可以看作点)到岛屿的距离不超过 d (整数),则认为该雷达覆盖了该岛屿。雷达只能放在 x 轴上。问至少需要多少个雷达才可以覆盖全部岛屿。原题地址输入:输入包含几个测试用例。 每种情况的第一行包含两个整数 n(1 <...原创 2019-04-14 23:09:45 · 1348 阅读 · 2 评论 -
30- 0-1背包问题
问题描述有 N 件物品和一个容积为 M 的背包。第 i 件物品的体积 w[i],价值是 d[i]。求解将哪些物品装入背包可使价值总和最大。每种物品只有一件,可以选择放或者不放 (N<=3500,M <= 13000)。Example:number=4,capacity=8i1234w(体积)2345v(价值)3456Outp...原创 2019-05-03 01:09:28 · 390 阅读 · 0 评论 -
36-踩方格
问题描述有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;走过的格子立即塌陷无法再走第二次;只能向北、东、西三个方向走;请问:如果允许在方格矩阵上走n步(n<=20),共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。思路:用递归解决从 (i, j) 出发,走 n 步的方案数,等于以下三项之和...原创 2019-08-13 20:04:09 · 526 阅读 · 0 评论 -
抓住这头牛
问题描述农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点 (0<=N<=100000),牛位于点 K(0<=K<=100000)。农夫有两种移动方式:从X移动到X-1或X+1,每次移动花费一分钟从X移动到2*X,每次移动花费一分钟假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?问题分析假设农夫起始位于点3,牛位...原创 2019-08-15 21:05:59 · 399 阅读 · 0 评论 -
17-归并排序
|-- main.c| |-- fun1| |-- fun2| |-- fun3| |-- main||-- sched.c| |-- pick| |-- schedule||-- thread.c| |-- thread_create| |-- start||-- switch.s|-- switch_to原创 2019-03-03 20:39:16 · 261 阅读 · 0 评论 -
19-求排列的逆序数
例题:求排列的逆序数题目描述考虑1,2,…,n (n <= 100000)的排列i1,i2,…,in,如果其中存在 j,k,满足j < k 且 ij > ik, 那么就称(ij,ik)是这个排列的一个逆序。一个排列含有逆序的个数称为这个排列的逆序数。例如排列2,6,3,4,5,1 含有8个逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1)...原创 2019-03-06 11:31:40 · 1836 阅读 · 0 评论 -
16-寻找指定和的整数对
1、问题描述例题:寻找指定和的整数对输入 n ( n&amp;lt;= 100,000)个整数,找出其中的两个数,它们之和等于整数 m (假定肯定有解)。题中所有整数都能用 int 表示2、问题分析首先想到最简单的用两重循环,枚举所有的取数方法,复杂度是O(n2)的。for(int i = 0;i &amp;lt; n-1; ++i) for(int j = i + 1; j &amp;lt; n; ++j)...原创 2019-02-26 23:44:56 · 1697 阅读 · 1 评论 -
算法基础修炼指南(更新中...)
第一章 枚举完美立方生理周期称硬币熄灯问题(1)熄灯问题(2)第二章 递归(上)求阶乘汉诺塔N皇后逆波兰表达式求值第三章 递归(下)表达式求值上台阶放苹果算24第四章 二分算法程序或算法的时间复杂度二分查找的原理和实现二分法求方程的根例题1 找 一对数例题2 农夫和奶牛第五章 分治归并排序快速排序输出前m大的数求排列的逆序数...原创 2019-02-14 21:55:57 · 592 阅读 · 1 评论 -
6-汉诺塔问题 (Hanoi)
汉诺塔问题(Hanoi)是一个典型的将问题分解为规模更小的子问题进行求解的案例。1、题目描述古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求输出移动的步骤。2、解题分析把这...原创 2019-02-14 23:09:27 · 2550 阅读 · 0 评论 -
1-完美立方
枚举含义枚举是一种基于逐个尝试答案的一种问题求解策略。简单点的说,很多问题我们无法找到数学公式直接计算出结果,只能一个一个的去尝试,这就是枚举。举个例子 : 求小于 N 的最大素数,找不到一个数学公式,把 N 带进去,求出答案,我们只能逐个逐个的去尝试,直到找到结果,过程如下:计算N-1是素数吗 ? N -2是素数吗 ? ……下面来看一个例子,亲身感受一下枚举的过程。例题:完美立方题...原创 2019-01-29 16:08:39 · 1200 阅读 · 1 评论 -
14-二分查找的原理和实现
举个例子,A 心里想一个1-1000之间的数,让 B 来猜,B 可以问问题,A 只能回答是或否。怎么猜才能问的问题次数最少?最笨的方法就是从1开始问,是1吗?是2吗?…是999吗?如果是1,问一次就得到答案了,如果A想的是1000,需要1000次才能得到答案,平均要问500次。还有一种问法,从中间开始问,一次将范围缩小一半。大于500吗?回答是,大于750吗?回答否,大于625吗? …每次缩小...原创 2019-02-21 15:09:17 · 626 阅读 · 0 评论 -
7-N皇后问题
上个例子(汉诺塔问题),我们讲解了利用递归其中一个作用,将一个问题分解成规模更小的子问题进行求解。现在用N皇后问题开说明一下递归的另一个作用:用递归代替多重循环。1、问题描述n皇后问题:输入整数 n,要求 n 个国际象棋的皇后,摆在 n*n 的棋盘上,互相不能攻击,输出全部方案。输出结果里的每一行都代表种摆法。行里的第 i 个数字如果是 n,就代表第 i 行的皇后应该放在第 n 列。皇后的...原创 2019-02-15 17:22:49 · 2516 阅读 · 0 评论 -
8-逆波兰表达式
前面讲解了用递归替代多重循环的问题,N皇后问题,用递归将问题分解为规模更小的子问题进行求解,汉诺塔问题,现在来讲解一个递归的第三个作用,解决本来就是用递归形式定义的问题。仍然使用例子来说明。1、问题描述例题:逆波兰表达式逆波兰表达式是一种把运算符前置的算术表达式(其实一般教科书上称这种表达式为波兰表达式),例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不...原创 2019-02-15 23:49:35 · 389 阅读 · 0 评论 -
2-生理周期
上一篇中讲解了什么是枚举,并通过一个例子说明了枚举的过程,枚举的确是一个个的尝试答案,但是很多尝试我们就知道它一定不满足要求,所以要尽量减少枚举的次数,这是枚举中的重点。下面通过一个例子来说明减少枚举尝试次数。1、举例说明题目描述:人有体力、情商、智商的高峰日子,它们分别每隔23天、28天和33天出现一次。 对于每个人,我们想知道何时三个高峰落在同一天。给定三个高峰出现的日子p,e 和 i...原创 2019-02-08 22:37:36 · 1036 阅读 · 0 评论 -
10-爬楼梯
用递归将问题分解为规模更小的子问题进行求解,用爬楼梯(也叫青蛙跳台阶)这个问题分析一下如何将问题规模变小,用递归求解,问题虽然很简单,但是很具有代表性。1、问题描述树老师爬楼梯,他可以每次走1级或者2级, 输入楼梯的级数,求一共有多少种走法。例如:楼梯一共有3级,他可以每次都走一级;或者第一次走一级,第二次走两级;也可以第一次走两级,第二次走一级,一共3种方法。输入输入包含若干行,每行包含...原创 2019-02-16 11:14:39 · 358 阅读 · 0 评论 -
3-称硬币
class Solution {public: int InversePairs(vector&amp;amp;amp;amp;lt;int&amp;amp;amp;amp;gt; data) { int len=data.size();// vector&amp;amp;amp;amp;lt;int&amp;amp;amp;amp;gt;copy(len,0); vector&原创 2019-02-10 00:17:00 · 1787 阅读 · 2 评论 -
9-四则运算表达式求值
用递归解决递归形式的问题1、问题描述例题: 四则运算表达式求值输入为四则运算表达式,仅由整数、+、-、*、/ 、(、)组成,没有空格,要求求其值。假设运算符结果都是整数。"/"结果也是整数。2、问题分析...原创 2019-02-17 22:58:07 · 765 阅读 · 0 评论 -
4-熄灯问题
总结用二进制数进行枚举位运算的使用原创 2019-02-13 10:37:12 · 1819 阅读 · 1 评论 -
15-二分法求方程的根
二分查找的思想就是每次将区间变成原来的一半,不断的将区间缩小,来逼近最后的值。现在来看一个利用二分查找来求解方程的根的问题。1、问题描述求下面方程的一个根:f(x) = x3-5x2+10x-80 = 0若求出的根是a,则要求|f(a)| &lt;= 10-62、问题分析解法:对f(x)求导,得f’(x)=3x2-10x+10。由一元二次方程求根公式知方程f’(x)= 0 无解,因此f’...原创 2019-02-24 21:44:43 · 651 阅读 · 0 评论 -
11-放苹果
再看一下用递归将问题分解为规模更小的子问题进行求解的例子。1、问题描述把 M 个同样的苹果放在 N 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?5,1,1和1,5,1 是同一种分法。输入:第一行是测试数据的数目 t(0 <= t <= 20)。以下每行均包含二个整数 M 和 N,以空格分开。1<=M,N<=10。输出:对输入的每组数据 M 和 ...原创 2019-02-19 21:09:37 · 330 阅读 · 0 评论 -
12-算24
对于递归的最后一个问题,我们来看一下稍微复杂点的问题,这里的思想仍然是将问题分解为规模更小的子问题。1、问题描述例题:算24给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法)。比如,对于5,5,5...原创 2019-02-19 23:36:28 · 708 阅读 · 0 评论 -
13-程序或算法的时间复杂度
1、概念这里的时间复杂度是指一个程序或算法的时间效率,也称“时间复杂度”,简称“复杂度”。一般用大的字母 O 和小写字母 n 来表示,比如 O(n),O(n2 ) 等。这里的 n 代表问题的规模,就是要处理的数据量。时间复杂度是用算法运行过程中,某种时间固定的操作需要被执行的次数和 n 的关系来度量的。比如在无序数列中查找某个数,与数的数量成正比,复杂度是 O(n)。计算复杂度的时候,只统计执...原创 2019-02-21 11:38:40 · 516 阅读 · 0 评论 -
20-输出前m大的数
例题:输出前m大的数题目描述给定一个数组包含n个元素,统计前m大的数并且把这m个数从大到小输出。输入第一行包含一个整数n,表示数组的大小。n &amp;lt; 100000。第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。第三行包含一个整数m。m &amp;lt; n。输出从大到小输出前m大的数,每个数一行。题目分析思路:用分治处理,把前m大...原创 2019-03-05 23:29:49 · 776 阅读 · 2 评论 -
35-城堡问题
问题描述如图是一个城堡的地形图。请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。城堡被分割成 m×n(m≤50,n≤50) 个方块,每个方块可以有 0~4 面墙。数据保证城堡四周都是墙输入程序从标准输入设备读入数据。第一行是两个整数,分别是南北向、东西向的方块数。在接下来的输入行里,每个方块用一个数字 (0≤p≤50) 描述。用一个数字表示方块周围的墙,1 表示西墙,2 ...原创 2019-08-12 19:45:23 · 349 阅读 · 0 评论