算法学习
笼包要做程序员
这个作者很懒,什么都没留下…
展开
-
程序设计与算法(二)算法基础-郭炜 7.3.1 例题3神奇的口袋
例五、神奇的口袋(百练2755) 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。 John现在有n (1 <= n <= 20) 个想要得到的物品,每个物品的体积分别是a1,a2…an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。 输入 输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来原创 2021-04-07 16:22:28 · 108 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 6.5.1 最长公共子序列
动归的常用两种形式 1)递归型 优点:直观,容易编写 缺点:可能会因递归层数太深导致爆栈,函数调用带来额外时间开销。无法使用滚动数组节省空间。总体来说,比递推型慢。 1)递推型 效率高,有可能使用滚动数组节省空间 例三、最长公共子序列(POJ1458) 给出两个字符串,求出这样的一个最长的公共子序列的长度:子序列中的每个字符都能在两个原串中找到,而且每个字符的先后顺序和原串中的先后顺序一致。 Sample Input abcfbc abfcab programming contest abcd原创 2021-03-28 09:59:32 · 113 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 6.4.1动态规划的一般思路 && 例题.最长公共子序列
递归到动规的一般转化方法 递归函数有n个参数,就定义一个n维的数组,数组的下标是递归函数参数的取值范围,数组元素的值是递归函数的返回值,这样就可以从边界值开始,逐步填充数组,相当于计算递归函数值的逆过程。 动规解题的一般思路 1.将原问题分解为子问题 ·把原问题分解为若干个子问题,子问题和原问题形式相同 或类似,只不过规模变小了。子问题都解决,原问题即解决(数字三角形例)。 ·子问题的解一旦求出就会被保存,所以每个子问题只需求 解一次。 2.确定状态 所有“状态”的集合,构成问题的“状态空间“。而”状态空间原创 2021-03-27 16:26:53 · 159 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 6.2.1 数字三角形(2)
递归转成递推 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的数字三角形中寻找一条从顶部原创 2021-03-26 17:53:27 · 97 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 6.1.1 数字三角形
例题一、数字三角形(POJ1163) 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或右下走。只需要求出这个最大和即可,不必给出具体路径。 三角形的行数大于1小于等于100,数字为0- 99 解题思路: 用二维数组存放数字三角形。 D(r, j):第r行第j个数字(r,j从1开始算) MaxSum(r, j):从D(r,j)到底边的各条路径中, 最佳路径的数字之和。 问题:求MaxSum(原创 2021-03-21 10:29:24 · 102 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 5.2.1 快速排序
5.2.1 快速排序 分治的典型应用:快速排序 数组排序任务可以如下完成: 1)设k=a[0],将k挪到适当位置,使得比k小的元素都在k左边,比k大的元素都在k右边,和k相等的,不关心在k左右出现均可 2)把k左边的部分快速排序 3)把k右边的部分快速排序 #include <iostream> using namespace std; void swap(int &a,int &b) { int tmp = a; a = b; b = tmp; } void Quic原创 2021-03-20 11:45:39 · 110 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 5.1.1归并排序
分治的基本概念 把一个任务,分成形式和原任务相同,但规模更小的几个部分任务(通常是两个部分),分别完成,或只需要选一部完成。然后再处理完成后的这一个或几个部分的结果,实现整个任务的完成。 分治的生活实例–称假币 16硬币,有可能有1枚假币,假币比真币轻。有一架天平,用最少称量次数确定有没有假币,若有的话,假币是哪一枚。 解: 8 - 8一称,发现无假币,或假币所在的那8枚 4 - 4一称 2 - 2一称 1 - 1一称 分治的典型应用:归并排序 数组排序任务可以如下完成: 1)把前一半排序 2)把后一半排序原创 2021-03-19 15:55:02 · 98 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 4.3.1二分法求方程的根
二分法求方程的根 求下面方程的一个根:f(x)=x3−5x2+10x−80=0f(x)=x^3-5x^2+10x-80 = 0f(x)=x3−5x2+10x−80=0 若求出的根是a,则要求∣f(a)∣<=10−6|f(a)|<= 10^{-6}∣f(a)∣<=10−6 ●解法:对f(x)求导,得f′(x)=3x2−10x+10f'(x)=3x^2-10x+10f′(x)=3x2−10x+10。由一元二次方程求根公式知方程f’(x)=0无解,因此f’(x)恒大于0。故f(x)是单调递增的。原创 2021-03-16 17:24:17 · 185 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 3.4.1 算24
例题:算24 给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。 这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法)。 输入: 输入数据包括多行,每行给出一组测试数据,包括4个小于10个正整数。最后一组测试数据中包括4个0,表示输入的结束,这组数据不用处理。 输出: 对于每一组测试数据,输出一行,如果可以得到24,输出“YES”;否则,输出“NO”。 样例输入:原创 2021-02-15 18:45:09 · 187 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 3.3.1放苹果
程序设计与算法(二)算法基础-郭炜 3.3.1放苹果 例题:放苹果 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法? 5,1,1和1,5,1是同一种分法。 输入 第一行是测试数据的数目t (0<=t<=20) 以下每行均包含二个整 数M和N,以空格分开。1<=M,N<=10。 输出: 对输入的每组数据M和N,用一行输出相应的K样例输入 1 73 样例输出: 8 设i个苹果放在k个盘子里放法总数是f(i,k),则: k > i时,f (i,k)原创 2021-02-08 18:30:05 · 125 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 3.2.1 上台阶
用递归将问题分解为规模更小的子问题进行求解 例题:爬楼梯 树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数。 例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级,也可以第一次走两级,第二次走一级,一共3种方法。 输入: 输入包含若干行,每行包含一个正整数N,代表楼梯级数,1<=N<=30输出不同的走法数,每一行输入对应一行 输出: 不同的走法数,每一行输入对应一行输出样例输入 5 8 10 样例输出8 34 89 c++代码如下: #include &原创 2021-02-06 19:24:13 · 105 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 3.1.1 表达式求值
程序设计与算法(二)算法基础-郭炜 3.1.1 表达式求值 用递归解决递归形式的问题 例题:表达式计算 输入为四则运算表达式,仅由数字、+、-、*、/、(、)组成,没有空格,要求求其值。假设运算符结果都是整数。结果也是整数 其中,表达式、项、因子的递归形式如下图: 因此对于表达式可以进行递归分析处理 c++代码如下: #include <iostream> #include <cstring> #include <cstdlib> using namespace st原创 2021-02-05 21:54:46 · 167 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 2.4.1逆波兰表达式求值
用递归解决递归形式问题 例题:逆波兰表达式 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2t3的逆波兰表示法为+2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2+3) * 4的逆波兰表示法为+2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * / 四个。 (郭炜老师:其实这里应该叫波兰表达式,逆波兰表达式为符号在后面的式子) 输入: 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点 数 输出: 输出为一行,表达式的值。 样例输原创 2021-02-03 15:35:32 · 128 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 2.3.1 N皇后问题
程序设计与算法(二)算法基础-郭炜 2.3.1 N皇后问题 用递归替代多重循环 n皇后问题:输入整数n,要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击,输出全部方案。 输入一个正整数N,则程序输出N皇后问题的全部摆法。输出结果里的每一行都代表一种摆法。行里的第i个数字如果是n,就代表第i行的皇后应该放在第n列。 皇后的行、列编号都是从1开始算。 样例输入: 4 样例输出: 2 4 1 3 3 1 4 2 c++代码如下: #include <iostream> #include <原创 2021-02-02 17:54:15 · 235 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 2.1.1 汉诺塔问题
程序设计与算法(二)算法基础-郭炜 2.1.1 汉诺塔问题 古代有一个梵塔﹐塔内有三个座A、B、C,A座上有64个盘子﹐盘子大小不等,大的在下﹐小的在上(如图)。有一个和尚想把这64个盘子从A座移到c座﹐但每次只能允许移动一个盘子﹐并且在移动过程中﹐3个座上的盘子始终保持大盘在下﹐小盘在上。在移动过程中可以利用B座﹐要求输出移动的步骤。 #include <iostream> using namespace std; void Hanoi(int n,char src,char mid,cha原创 2021-02-01 19:23:05 · 117 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 1.4.1 熄灯问题
程序设计与算法(二)算法基础-郭炜 1.4.1 熄灯问题 有一个由按钮组成的矩阵,其中每行有6个按钮,共5行。每个按钮的位置上有一盏灯。当按下一个按钮后,该按钮以及周围位置(上边、下边、左边、右边)的灯都会改变一次。即,如果灯原来是点亮的,就会被熄灭;如果灯原来是熄灭的,则会被点亮。在矩阵角上的按钮改变3盏灯的状态;在矩阵边上的按钮改变4盏灯的状态;其他的按钮改变5盏灯的状态。 在上图中,左边矩阵中用X标记的按钮表示被按下,右边的矩阵表示灯状态的改变。对矩阵中的每盏灯设置一个初始状态。请你按按钮,直至每一原创 2021-01-31 20:52:53 · 241 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 1.1.1 完美立方
程序设计与算法(二)算法基础-郭炜 1.1.1 完美立方 形如a3= b3 +c3 +d3的等式被称为完美立方等式。例如123=63 +83 + 103。编写一个程序,对任给的正整数N(N≤100),寻找所有的四元组(a, b,c, d),使得a3=b3+ c3+d3,其中a,b, c, d 大于1,小于等于N,且b<=c<=d。 输入: 一个正整数N(N≤100)。 输出: 每行输出一个完美立方。输出格式为:Cube = a,Triple = (b,c, d) 其中a, b, c,d所在位置分原创 2021-01-29 15:16:58 · 229 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 1.3.1 称硬币
程序设计与算法(二)算法基础-郭炜 1.3.1 称硬币 有12枚硬币。其中有11枚真币和1枚假币。假币和真币重量不同,但不知道假币比真币轻还是重。现在,用一架天平称了这些币三次,告诉你称的结果,请你找出假币并且确定假币是轻是重(数据保证一定能找出来)。 输入样例: ABCD EFGH even ABCI EFJK upABIJ EFGH even 输出样例: K is the counterfeit coin and it is light. 注意:天平左右的硬币数总是相等的 c++代码如下: #inclu原创 2021-01-27 17:39:56 · 211 阅读 · 0 评论 -
程序设计与算法(二)算法基础-郭炜 1.2.1 生理周期
程序设计与算法(二)算法基础-郭炜 1.2.1 生理周期 人有体力、情商、智商的高峰日子,它们分别每隔23天、28天和33天出现一次。对于每个人,我们想知道何时三个高峰落在同一天。给定三个高峰出现的日子p,e和i(不一定是第一次高峰出现的日子),再给定另一-个指定的日子d,你的任务是输出日子d之后,下一次三个高峰落在同一天的日子(用距离d的天数表示)。例如:给定日子为10,下次出现三个高峰同一天的日子是12,则输出2。 输入:输入四个整数: p,e,i和d。p,e,i分别表示体力、情感和智力高峰出现的日子。原创 2021-01-26 21:49:06 · 212 阅读 · 0 评论