《算法艺术与信息学竞赛》标准演示课件.pptVIP

  • 1
  • 0
  • 约4千字
  • 约 47页
  • 2019-12-22 发布于湖北
  • 举报

《算法艺术与信息学竞赛》标准演示课件.ppt

分析 可以用矩阵来保存结果 C[j,k]表示从j到k的关键码组成的最优排序二叉树 Root[j,k]记录这棵排序二叉树的根 * jjjkk 分析 考虑三个结点的情形 最优值放在C[B,D]中,根放在root[B,D]中 * jjjkk 分析 类似地,更新所有C[j-2,j]和root[j-2,j] * jjjkk 分析 四个结点的情形(如A-D) * jjjkk 分析 最终计算结果为 * jjjkk 分析 可以利用root矩阵递归地构造出最优树 * jjjkk 分析 时间复杂度:计算每个C[i,j]和root[i,j]需要枚举根结点,故为O(n3) 空间复杂度:需要两个n*n矩阵,O(n2) * jjjkk 三、最长上升子序列 最长上升子序列问题(LIS)给一个序列,求它的一个递增子序列,使它的元素个数尽量多。例如序列1,6,2,5,4,7的最长上升子序列是1,2,5,7(还有其他的,这里略去) * jjjkk 分析 定义d[i]是从第1个元素到第i个元素为止的最长子序列长度, 则状态转移方程为 直接使用这个方程得到的是O(n2)算法 下面把它优化到O(nlogn) * jjjkk 状态的组织 d值相同的a值只需要保留最小的, 因此用数组g[i]表示d值为i的数的a最小值, 显然 g[1]=g[2]=…=g[k] 计算d[i]: 需要在g中找到大于等于a[i]的第一个数j, 则d[i]=j 更新g: 由于g[j]a[i], 需要更新g[j]=a[i] * jjjkk 代码 使用STL的lower_bound可以直接求出比a[i]大的第一个数, 用二分查找实现, 每次转移时间O(logn), 总时间O(nlogn) fill(g,?g?+?n,?infinity); for(int?i?=?0;?i??n;?i++){ int?j?=?lower_bound(g,?g?+?n,?a[i])?-?g; ??d[i]?=?j?+?1; ??g[j]?=?a[i]; } * jjjkk 变形1: 航线问题 有两行点, 每行n个. 第一行点和第二行点是一一对应的, 有线连接, 如下图所示 选择尽量多的线, 两两不交叉 * jjjkk 分析 设与第1行第i个点对应的是第2行第f[i]个点 假设ij, 两条线(i, f[i])和(j, f[j])的充要条件是f[i]f[j], 因此问题变成了 求f的最长上升子序列 时间复杂度为O(nlogn) * jjjkk 变形2: 两排列的LCS 给1~n的两个排列p1, p2 求p1和p2的最长公共子序列 例: 1 5 3 2 4 ? 5 3 4 2 1 * jjjkk 分析 算法一: 直接套用LCS算法, 时间O(n2) 算法二: 注意到把两个排列做相同的置换, LCS不变, 可以先把p1排列为1,2,3…,n 1 5 3 2 4 ? 1 2 3 4 5 即映射5?2, 2?4, 4?5, p2作同样置换 5 3 4 2 1 ? 2 3 5 4 1 与1,2,3..n的LCS显然是最长上升子序列, 时间降为O(nlogn) * jjjkk 推广: DAG上的最短路 “上升”依赖于序关系=, 它具有一般性 DAG(有向无环图)的最长路径问题: 把有向边看成偏序关系, 则本题的算法一仍然适用, 时间复杂度为O(n2). 如果图的边数m比较, 可进一步优化到O(m), 因为每条边恰好考虑一次(用邻接表或前向星, 而不是邻接矩阵) 算法二不再适用! 因为d值相同的a不一定可以两两相互比较, 不一定存在最小值. * jjjkk 四、最优三角剖分 给一个n个顶点的凸多边形, 有很多方法对它进行三角剖分(polygon triangulation) 每个三角形有一个权计算公式(如周长, 顶点权和), 求总权最小(大)的三角剖分方案 * jjjkk kkkkk ggggg kkkkk ggggg kkkkk ggggg kkkkk ggggg kkkkk ggggg kkkkk ggggg kkkkk ggggg kkkkk ggggg kkkkk ggggg kkkkk ggggg kkkkk ggggg kkkkk ggggg kkkkk ggggg kkkkk ggggg kkkkk ggggg kkkkk ggggg 《算法艺术与信息学竞赛》 标准课件 动态规划(一): 经典问题 刘汝佳 * jjjkk 目录 一、最长公共子序列O(mn) 二、最优排序二叉树O(n3) 三、最长上升子序列O(nlogn) 四、最优三角剖分O(n3) 五、最大m子段和O(mn) 六、0-1背包问题O(min{nc, 2n, n1.44n}) * jjjkk 一、最长公共子序列 Longest Common Sub

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档