算法设计与分析
梦里飞雪飘
哈工大在读本科生
展开
-
动态规划--前缀动态规划问题
最长公共子序列问题问题定义:输入:X = (x1,x2,…,xm) , Y = (y1,y2,…yn)输出:公共子序列长度(拓展:如何打印公共子序列)如何用子问题表示dp[ i ][ j ]表示X的i前缀与Y的j前缀的最长公共子序列长度则总问题==dp[ m ][ n ];优化子结构和重叠子问题递归表达式if X[ i ] == Y[ j ] ,则dp[ i ][ j ] = dp[ i-1 ][ j-1 ] + 1;else, 则dp[原创 2021-06-24 21:35:47 · 250 阅读 · 3 评论 -
动态规划--数轴动态规划问题
01背包问题1.如何用子问题表示P[1…n , C]表示总问题dp[ i ][ j ]表示P[ i…n,j ]的最大价值则总问题P[1…n , C] = max{ P[2…n , C - v1 ] , P[ 2…n , C] }2. 优化子结构和重叠子问题3. 递归表达式dp[ i ][ j ] = max{ dp[ i + 1][ j - wi ] + vi , dp[ i + 1][ j ]}(选与不选)递归终点:dp[ n ] [ j ] = vn (j > wn) ; dp[原创 2021-06-24 21:27:26 · 200 阅读 · 0 评论 -
动态规划--划分动态规划问题
矩阵连乘问题输入:<A1,A 2,…,An>, Ai是矩阵输出:计算A1 A2 … An的最小代价方法若A是p *q矩阵,B是q *r矩阵,则A *B的代价是O(pqr)如何用子问题表示dp[ i ][ j ]表示从 Ai 乘到 Aj 的最小代价方法总问题表示为dp[ 1 ][ n ]优化子结构和重叠子问题递归方程式dp[ i ][ j ] = min{ dp[ i ][ k ] + dp[ k+1 ][ j ] + w(Vi-1 Vk Vj)}w(Vi-1 V原创 2021-06-24 21:22:26 · 137 阅读 · 0 评论 -
动态规划--编号动态规划问题
最长递增序列问题输入:A[1 2…n]输出:最长递子增序列的长度思考过程1.如何用子问题来表示设:dp[ i ]表示以第 i 个元素结尾的最长序列长度则总问题==max(dp[ i ]),其中i=1,2…n。2.优化子结构和重叠子问题3.递归方程的建立dp[ i ] = max{ dp[ j ](其中j < i且aj < ai)}+1递归终点:dp[ 0 ] = 1;4.自底向上的计算5. 伪代码For i = 1 To n: dp[ i ] <~ 0;//初始原创 2021-06-24 21:03:22 · 183 阅读 · 0 评论 -
贪心法--最小生成树
一.Kruskal算法思路:每次在图中选择一条最短的且不构成环的边,重复V-1次得到最小生成树注:不在一个集合表示不连通,保证了不会形成环伪代码实现:时间复杂度分析边排序:O(ElogE)建立集合:O(V)查找集合与合并集合O:O((V+E)logV)时间复杂度:O(ElogE)正确性证明 :优化子结构:设uv是G中权值最小的边,则必有一棵最 小生成树包含边uv.(反证法)贪心选择性:按照点的个数进行归纳证明二.Prim算法1.思路:设置空图G’,先将任意顶原创 2021-06-24 20:39:57 · 416 阅读 · 0 评论 -
贪心算法介绍及合理性证明
性质优化子结构若一个优化问题的优化解包含它的 子问题的优化解,则称其具有优化子结构贪心选择性若一个优化问题的全局优化解可以通过 局部优化选择得到,则该问题称为具有 贪心选择性.通用解决方法使用贪心算法解决问题时:设计贪心方法证明贪心法的正确性(有时比设计算法更重要)例:活动最大相容问题(1) 证明优化子结构活动按照结束时间已经排好序即证明:设A是问题S的一个优化解且包含活动1,则A-{1}是问题S’(S’中最早的开始时间晚于f1)的优化解反证法(略)(2原创 2021-06-24 20:33:12 · 580 阅读 · 0 评论 -
分治法--最邻近点对问题
问题定义:输入:空间上n个点的集合Q输出:最近点的距离定义:Dis(X,Y)为点X和点Y之间的距离,Cross(Q1,Q2)为横跨Q1和Q2两个点集的最小距离**【一维】**思路:划分:将数轴上的点用中位数m分成两个集合求解:递归在Q1和Q2中求解子问题合并:MIN(Q)= min(MIN(Q1),MIN(Q2),Cross(Q1,Q2))时间复杂度分析:划分:O(n);求解:2T(n/2);合并:O(1);T(n)= 2T(n/2)+ O(n) = O(nlog原创 2021-06-24 20:25:44 · 490 阅读 · 0 评论