Loading [MathJax]/jax/element/mml/optable/GeneralPunctuation.js

随笔分类 -  Algorithm-Homework

算法作业
摘要:近期在队友的影响下,开始学习《算法竞赛进阶指南》这本书。对于本来就有一定算法基础的我来说,这本书不论是对于学习不常见的新算法还是对于基础算法的巩固都有很大的帮助。其中,数据结构和图论的一些巧妙的算法令我非常感兴趣。 就数据结构方面的算法来说,线段树在书中是一个重头,这个算法在维护区间上有着很优秀的时 阅读全文
posted @ 2020-06-10 18:41 Big-Kelly 阅读(259) 评论(0) 推荐(1) 编辑
摘要:问题: 给定无向连通图Gm种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答”NO”。 解析: 对于每个点选择颜色i时判断其与所有相连的已着色的点是否发生颜色冲突,若未发生冲突,则dfs向后 阅读全文
posted @ 2020-06-02 22:52 Big-Kelly 阅读(202) 评论(0) 推荐(0) 编辑
摘要:问题: 给定字符集和每个字符出现的频率,构造最优前缀码。 解析: 贪心构造最优前缀码,按照频率从小到大排序,最小两个字符频率相加后产生新的字符频率加入优先队列中,频率越小离树根越远。 设计(核心代码): 1 while (q.size() > 1) { 2 x = q.top(); 3 q.pop( 阅读全文
posted @ 2020-05-19 10:51 Big-Kelly 阅读(180) 评论(0) 推荐(0) 编辑
摘要:问题: 有n项活动申请使用同一个礼堂,每项活动有一个开始时间和一个截止时间。如果任何两个活动不能同时举行,问如何选择这些活动,从而使得被安排的活动数量达到最多。 解析: 如果我们选择开始时间最早的节目,得不到最优解 如果我们选择时间最短的节目,也无法得到最优解 可以用数学归纳法证明,我们的贪心策略应 阅读全文
posted @ 2020-05-01 18:23 Big-Kelly 阅读(224) 评论(0) 推荐(0) 编辑
摘要:问题: 给定序列X,Y,求最长公共子序列。 解析: 设dp[i][j]表示前ix和前jy的最长公共子序列。 dp[i][j]=max(dp[i][j],dp[i-1][j],dp[i][j-1]) 当前最长由前一个转移过来 $if(x[i]==y[j]) dp[i][ 阅读全文
posted @ 2020-04-28 22:06 Big-Kelly 阅读(146) 评论(0) 推荐(0) 编辑
摘要:问题: 设n个矩阵序列,其中第i个矩阵是p[i-1]*p[i]阶矩阵,给定矩阵链的向量P,求一种乘法次序,使得基本运算的总次数最小。 解析: 设A[i][j]\prod_{k=i}^{j}{a[k]}F[i][j]A[i][j]的最少运算次数。 $F[i][j]= 阅读全文
posted @ 2020-04-21 15:30 Big-Kelly 阅读(172) 评论(0) 推荐(0) 编辑
摘要:问题: 设m元钱,n项投资,函数f[i][x]表示将x元投入第i项项目所产生的效益,i=1,2,…,n.问:如何分配这m元钱,使得投资的总效益最高? 解析: 背包问题。 设dp[i][j]表示在前i个项目投入j元所产生的最大效益。 转移方程为: $dp[i][j] 阅读全文
posted @ 2020-04-13 21:40 Big-Kelly 阅读(191) 评论(0) 推荐(0) 编辑
摘要:问题: 给出一个数组a[n],求第k小元素是什么。 解析: 分治思想,将数组五个一组划分,并计算出每组数的中位数。然后把各组中位数的中位数找出。统计数组中小于中位数的个数num,有三种情况。 ① num = k,则中位数就是要查询的数。 ② num > k,则在小于中位数的集合中 阅读全文
posted @ 2020-04-07 21:49 Big-Kelly 阅读(196) 评论(0) 推荐(0) 编辑
摘要:问题: 对n个不同的数构成的数组A[1..n]进行排序,其中n=2^k。 解析: 分治思想,对于每个点堆,分成l和r两个点集,分别求每个点集中点的最近对。三种情况: ① l = r :只有一个点,返回 infl = r – 1:两个点,返回两个点的点距。 ③$l = r 阅读全文
posted @ 2020-03-30 22:10 Big-Kelly 阅读(135) 评论(0) 推荐(0) 编辑
摘要:问题: 对n个不同的数构成的数组A[1..n]进行排序,其中n=2^k. 解析: 根据分治的思想,对于每一个待排序的数组,拆分成左右两端,分别对左右两段进行排序,对于已经有序的两个数组把他们合并起来。 设计(核心代码): 1 void merge(int low,int mid,int high) 阅读全文
posted @ 2020-03-23 21:54 Big-Kelly 阅读(143) 评论(0) 推荐(0) 编辑
摘要:问题: 两种检索算法:在一个排好序的数组T[1..n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0. 解析: ①直接遍历数组,查找x。 ②二分查找。 设计(核心代码): ①遍历 1 void solve1(int x) 2 { 3 for(int i=1;i<=n;++i) 阅读全文
posted @ 2020-03-15 12:53 Big-Kelly 阅读(217) 评论(0) 推荐(0) 编辑
摘要:问题: 使用Dijkstra算法求由顶点a到顶点h的最短路径。 解析: 根据初始点,挨个的把离初始点最近的点一个一个找到并加入集合,集合中所有的点的dis[i]都是该点到初始点最短路径长度,由于后加入的点是根据集合S中的点为基础拓展的,所以也能找到最短路径。 设计(核心代码): 1 void dij 阅读全文
posted @ 2020-03-09 20:47 Big-Kelly 阅读(119) 评论(0) 推荐(0) 编辑
摘要:问题: 用Floyd算法求解下图各个顶点的最短距离。 解析: 任意两点间的最小距离要么直接相连,要么通过另外一个点相连。用每个点去更新两两点之间的距离即可。 设计(核心代码): 1 void floyd() 2 { 3 for (int k = 1; k <= n; ++k) 4 { 5 for ( 阅读全文
posted @ 2020-03-09 20:42 Big-Kelly 阅读(116) 评论(0) 推荐(0) 编辑
摘要:问题: Kruskal算法构造最小生成树的过程。 解析: Kruskal算法的基本思路: 对于所有的边,每次取一条最短的边(不能重复取),判断它的两个端点是否已经在一个连通块中了(并查集维护),如果是,那么取下一条边;如果没在一个连通块中,则把两个连通块(不一定是两个点)连在一起,答案加上当前边的长 阅读全文
posted @ 2020-02-29 14:41 Big-Kelly 阅读(140) 评论(0) 推荐(0) 编辑
摘要:问题: Prim算法构造最小生成树的过程。 解析: Prim算法的基本思路: 从一个点出发,找到该点相连的边的最短边,把这条边的另一个端点加入点集。不断找点集中点相连的最短边,若该边的另一个端点也在点集中,则找次短边;若该边的另一个端点不在点集中,则将该点加入点集,直到所有的点都在点集中。 解析图: 阅读全文
posted @ 2020-02-29 14:34 Big-Kelly 阅读(157) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示