算法设计与分析
《算法设计与分析》是由屈婉玲、刘田、张立昂、王捍贫编著。2011年清华大学出版社出版的普通高等教育“十一五”国家级规划教材、21世纪大学本科计算机专业系列教材。
编程初学者01
愿代码干净整洁,合理注释,不断进步。
展开
-
算法设计与分析之戳气球问题【动态规划】
有n个气球,编号为0到n-1,每个气球都有一个分数,存在nums数组中。每次戳气球i可以得到的分数为 nums[left] * nums[i] * nums[right],left和right分别表示i气球相邻的两个气球。当i气球被戳爆后,其左右两气球即为相邻。要求戳爆所有气球,得到最多的分数。1.你可以假设nums[-1] = nums[n] = 1。-1和n位置上的气球不真实存在,因此不能戳爆它们。备注:虽然最后追溯最优方案有点小问题,但是无伤大雅了。原创 2023-06-14 15:00:00 · 143 阅读 · 0 评论 -
算法设计与分析之最优二叉搜索树
给定一个n个不同关键字的已排序的序列K=,我们希望用这些关键字构造一颗二叉搜索树,对于给定的搜索频率,该二叉搜索树所需的期望代价最小。称这个二叉树为最优二叉搜索树。原创 2023-06-12 08:32:33 · 422 阅读 · 1 评论 -
算法课设 戳气球问题实验报告 动态规划
这道题其实并不难,关键在于 dp 数组的定义,需要避免子问题互相影响,所以我们反向思考,将 dp[i][j] 的定义设为开区间,考虑最后戳破的气球是哪一个,以此构建了状态转移方程。对于如何穷举「状态」,我们使用了小技巧,通过 base case 和最终状态推导出 i,j 的遍历方向,保证正确的状态转移。总而言之,收获颇丰。原创 2023-06-14 15:00:00 · 737 阅读 · 0 评论 -
算法设计与分析之线性时间选择算法
问题:给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素。(如果将这个线性集先排好序,则排在第k个位置的元素即为要找的元素)将n个输入元素划分成n/5(向上取整)个组,每组5个元素,最多只可能有一个组不是5个元素。用任意一种排序算法,将每组中的元素排好序,并取出每组的中位数,共n/5(向上取整)个。基本思想是对输入数组进行递归划分,与快速排序不同的是,它只对划分出的子数组之一进行递归处理。如果n/5(向上取整)是偶数,就找它的2个中位数中较大的一个作为划分基准。原创 2023-06-11 23:16:04 · 101 阅读 · 0 评论 -
算法设计与分析之最大子段和
将序列a[1:n]分成长度相等的两段a[1:n/2]和a[n/2+1:n],分别求出这两段的最大字段和,则a[1:n]的最大子段和有三中情形:a[1:n]的最大子段和与a[1:n/2]的最大子段和相同;a[1:n]的最大子段和与a[n/2+1:n]的最大子段和相同;a[1:n]的最大字段和为,且1原创 2023-06-11 23:23:31 · 186 阅读 · 0 评论 -
算法设计与分析之归并排序
归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。原创 2023-06-11 23:09:49 · 115 阅读 · 0 评论 -
背包问题贪心算法C++
【代码】背包问题贪心算法C++原创 2023-05-23 12:04:50 · 1016 阅读 · 0 评论 -
算法设计与分析之递归全排序
对于给定的集合A{a1,a2,…,an},其中的n个元素互不相同,如何输出这n个元素的所有排列(全排列)原创 2023-06-11 23:15:57 · 40 阅读 · 0 评论 -
活动安排贪心算法C++
设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si原创 2023-06-01 15:29:03 · 373 阅读 · 0 评论 -
算法设计与分析之快速排序
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。快速排序算法通过多次比较和交换来实现排序,其排序流程如下: [2]原创 2023-06-11 23:12:02 · 158 阅读 · 0 评论 -
算法设计与分析之插入排序
插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。原创 2023-06-11 23:06:16 · 76 阅读 · 0 评论 -
算法设计与分析之0—1背包问题
01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2至Wn,与之相对应的价值为P1,P2至Pn。01背包是背包问题中最简单的问题。01背包的约束条件是给定几种物品,每种物品有且只有一个,并且有权值和体积两个属性。在01背包问题中,因为每种物品只有一个,对于每个物品只需要考虑选与不选两种情况。如果不选择将其放入背包中,则不需要处理。如果选择将其放入背包中,由于不清楚之前放入的物品占据了多大的空间,需要枚举将这个物品放入背包后可能占据背包空间的所有情况。原创 2023-06-11 23:23:56 · 176 阅读 · 0 评论 -
算法设计与分析之最长公共子序列
最长公共子序列(LCS)是一个在一个序列集合中(通常为两个序列)用来查找所有序列中最长子序列的问题。一个数列 ,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则称为已知序列的最长公共子序列。[1]最长公共子序列问题是一个经典的计算机科学问题,也是数据比较程序,比如Diff工具,和生物信息学应用的基础。它也被广泛地应用在版本控制,比如Git用来调和文件之间的改变。原创 2023-06-11 23:19:14 · 191 阅读 · 0 评论