- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2005年浙江省队培训第4讲 题目选讲 刘汝佳 例题: 最大子矩阵 给n*n矩阵,求和最大的子矩阵 分析 枚举起、止行号r1和r2,压缩子矩形成为一行,变成一维问题, 第i个元素为b[i] = a[r1,i]+a[r1+1,i]+…+a[r2,i] 对于第i列, 计算前缀和prefixi[j]=a[1,i]+a[2,i]+…+a[j,i] 则b[i]=prefixi[r2]-prefixi[r1-1], 常数时间 计算前缀和: O(n2), 一维问题: O(n) 共O(n3) 思考: 最大环形子矩形 给n*n矩阵, 第一行和最后一行看作是连通的; 第一列和最后一列看作是连通的 求和最大的子矩阵 例题: 密度图 给出nr0,一个n*n矩阵F,矩阵中距离定义为两个格子的行坐标差和列坐标差中较大的一个 求出矩阵W,其中w[i,j]为F矩阵中到(i,j)距离不超过r的所有数的和 分析 方法一:N=5, r=1时考虑W(3,3)和W(3,4)的关系。需要计算一列上连续的一段和,同样可以递推得到 方法二:d[i,j]为从左上角到(i,j)的矩形内所有数的和 例题: 方格 给一些长度为1的线 格式: (x, y, D), 其中D可以是H(往右)或者V(往下) 数各个大小的正方形的个数。 分析 算法一: 用01矩阵表示每条边是否存在. 枚举左上角和边长O(n3), 检查四条边是否完全填充O(n), 共O(n4) 算法二: 预处理: 每个点往右最大长度为几, 从右往左递推d[i] = d[i+1] + 1, 或d[i]=0, 预处理O(n2) 算法一降为O(n3) 例题: 城市正视图 求正南视图中, 哪些建筑物是可见的 下图从左到右依次为5, 9, 4, 3, 10, 2, 1, 14可见 分析 只需要判断南墙, 即每个建筑物变成矩形 预处理 从北到南排序所有南墙, 依次考虑 水平、竖直离散化 主算法 每次更新每个元线段的墙集合, 从低到高扫描 每个元线段上每个高度最多进/出集合一次, 因此每个元线段的维护只需要O(n) 一共有n条元线段, 因此为O(n2) 思考: 边界 给出从X,Y出发的路线(N,E,W,S),找出边界。 Bugs公司 Bugs公司生产一种2×3单位尺寸的高科技芯片嵌入N×M(N≤150,M≤10)单位尺寸的模板内,损坏的单位小方格已被标上黑色记号 芯片内不能有黑色记号,同时芯片与芯片不能重叠。将尽量多的芯片嵌入模板 分析 M=10, 可以考虑信息压缩的动态规划 定义基线B[i,j]为前i-1列和第i列前j行组成的图形, 若从右往左从下往上处理, 则B[i,j]为考虑格子(i,j)时的剩余棋盘 分析 剩余棋盘B[i,j]上能切下多少芯片要取决于B[i,j]已经有哪些格子被占用了 用(0,2,1,0,2)表示每行已经被占了几个格子(注意: 如果占了左边的格子, 右边也不能用) 分析 把占用情况看成3进制数, 则有3M种情况 设d[i,j,P]为B[i,j]的占用情况为P时最多能嵌入的芯片数, 转移方式: 忽略; 放2*3; 放3*2. 下图为处理到深灰色格时选择放置3*2 分析 状态有MN3M个, 转移为O(1)的, 总时间复杂度为O(MN3M) 空间复杂度为O(MN3M), 但可以用滚动数组优化, 即只保存相邻三列的占用情况,降为O(M3M),可以承受 优化: 很多P是不可能出现的, 因为只有2*3和3*2两种芯片, 无法产生单独的一列占用 最近公共祖先(LCA) 给一棵树T 设计在线算法, 对于询问(u, v), 回答u和v的最近公共祖先 算法一 算法一: O(nlogn)-O(log2n) 预处理 DFS求出每个结点的level. O(n) 递推得每个结点的2i级直接祖先, O(nlogn) 询问 二分LCA的层次 每次用倍增法求该层次上的父亲 询问是O(log2n)的 算法二 算法二: DFS求Euler序列, 即E[1…2n-1], 设R[i]为i第一次出现的下标, L[i]为E[i]的深度,则LCA转化为RMQ, 存在O(nlogn)-O(1)算法 若R[u]R[v], LCA(T,u,v) = RMQ(L,R[u],R[v]) 若R[u]R[v], LCA(T,u,v) = RMQ(L,R[v],R[u]) 算法三 算法三: 注意到L满足±1性质 把A划分成每部分为L=log2n/2的小块 一共有2n/log2n块 用O(n)求出每个小块的最小值A’[i] A’上的RMQ预处理: O(n), 询问O(1) 问题转化为询问In-RMQ(x, a, b), 即第x个块的第a个元素到第b个元素的最小值 算法三(续) 问题转化为询问In-RMQ(x, a, b), 即第x个块的第a个元素到第b个元素的最小值
文档评论(0)