随笔分类 - 学校课程---算法实践
摘要:问题: $n$个集装箱上两艘在中分别为$c_1$和$c_2$的轮船,$w_i$为集装箱$i$的重量,且$\sum_^nw_i \leq c_1 + c_2$ 问是否存在一种合理的装载方案将$n$个集装箱装上轮船?如果有,给出一种方案。 解析 要找到可能的情况,那么我们枚举每个点放在1号船还是2号船的
阅读全文
摘要:问题: 图的$m$着色问题。给定无向连通图$G$和$m$种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求$G$的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。 解析 为了找到所有方案,给每个点都要尝试$m$次。要满足边的两点不同色,染色后要检查周围点的染
阅读全文
摘要:问题: 给定字符集$C={x_1,x_2,\dots,x_n}$和每个字符的频率$f(x_i)$,求关于$C$的一个最优前缀码 解析 将所有的字符丢进一个堆中,按出现频率从小到大排序。按照哈夫曼算法,优先取出两个堆顶的元素,把它们出现的频率加在一起,再丢到堆里,直到只剩一个元素,就是最终得到的答案。
阅读全文
摘要:问题: 共有$n$种物品可放入背包,物品$j$的重量和价值分别为$w_j$, \(v_j\)。若背包的限重为$b$,求最大价值。 解析 设$dp[i][j]$用$j$容量装前$i$个物品能获得的最大值。对于第$i$个物品来说,可以选择放入和不放入,那么我们枚举$j$,就能得到转移方程。 \(dp[i
阅读全文
摘要:问题: 给定序列$a$和$b$,求它们的最长公共子序列。 解析 设$dp[i][j]$为在$a$串的前$i$个字符和$b$串的前$j$个字符中找到的$LCS$。我们枚举$i$和$j$,当$a[i] == b[j]$时,我们让$i$和$j$配对的结果一定时最优的。如果我们此时不选择配对,那么就只能选择
阅读全文
摘要:问题: 设$A_1, A_2, \dots, A_N$为$n$个矩阵的序列,其中$A_i$为$P_ \times P_i$阶矩阵,这个矩阵链的输入用向量$P=<P_0,P_1,\dots,P_n>$给出。 给定向量$P$,确定一种乘法次序,使得基本运算的总次数达到最小。 解析 可以将括号的乘法里看作
阅读全文
摘要:问题: 设$m$万元钱,$n$项投资,函数$f_i(x)$表示将$x$万元投入到第$i$项项目所产生的效益,\(i=1,2,\dots,n\)。问:如何分配这$m$万元,使得投资的总收益最高。 解析 设$dp[i][j]$为在前$i$个项目中投入$j$元能获得的最大收益。当$i = 1$时,我们从$
阅读全文
摘要:问题: 在序列中选取第k小的数字。 解析 我们先选取一个数字$x$,当序列中小于$x$的数字的数量为$k - 1$时,$x$就是我们要找的数字;数量大于等于$k$时,第$k$小的数字小于等于$x$;数量小于$k$时,第$k$小的数字大于等于$x$。我们将序列分成若干个五元组,将这个结论推广到二维序列
阅读全文
摘要:问题: 给定平面上$n$个点,找出其中的一对点的距离,使得在这$n$个点的所有点对中,该距离为所有点对中最小的。 解析 考虑暴力的方法,需要判断所有点对的距离。当$n$较小时,比较容易求解。合并两个区间时,可以考虑两个区间的最小值,只有当两个区间的点对距离不超过这个最小值时才会有意义。我们分别考虑$
阅读全文
摘要:问题: 二分归并排序:对$n$个不同的数构成的数组$A[1 \dots n]$进行排序,其中$n=2^k$ 解析 归并排序需要两个有序的数组,我们每次二分当前区间,将左右两个区间都变成有序的,就可以进行归并排序了。想要保证子区间有序,我们同样可以用相同的方式去对其进行排序,这就变成了一个递归的过程。
阅读全文
摘要:问题: 写出两种检索算法:在一个排好序的数组$T[1\dots n]$中查找$x$,如果$x$在$T$中,输出$x$在$T$的下标$j$;如果$x$不在$T$中,输出$j=0$.按实验模板编写,“分析”部分仅给出复杂度结果即可。 解析 因为数组已经排好序了,所以我们可以很容易地对其进行查找。 方法一
阅读全文
摘要:问题: 对于下图使用$Dijkstra$算法求由顶点$a$到顶点$h$的最短路径,按实验报告模板编写算法。 解析 我们从一个源点$S$出发,要找它到点$T$的最短距离,可以考虑将和源点相邻的点都放到我们的一个决策集合里。然后我们每次贪心地拿出到距离点$S$距离最近的点$u$,然后遍历跟点$u$相邻的
阅读全文
摘要:问题: 用Floyd算法求解下图各个顶点的最短距离。写出Floyd算法的伪代码和给出距离矩阵(顶点之间的最短距离矩阵),按实验报告模板编写算法。 解析 点$u$到点$v$有两种方案可以走,一种是点$u$直接到点$v$,一种是通过中间点$k$,点$u$先到点$k$,再从点$k$走到点$v$。然后我们枚
阅读全文
摘要:问题: Kruskal构造最小生成树的过程。 解析 将所有边存下来,按照权值从小到大排序,然后遍历所有边,每次询问边的两个点是否已经都在最小生成树里了,如果都在,就跳过,否则将其加入,遍历完所有边或者已经形成了最小生成树后结束。 解析图 设计 int kruskal() { int ans = 0;
阅读全文
摘要:问题: Prim构造最小生成树的过程。 解析 每次在最小生成树外的点中找到距离当前最小生成树距离最近的点,将其加入最小生成树内,同时更新跟它相邻的点距离最小生成树的距离。直到找不到点或者生成最小生成树为止。 解析图 设计 int prim() { d[1] = 0; ans = 0; for (1
阅读全文