算法读书笔记

《算法竞赛进阶指南》读后感

该书由李煜东著,是一本侧重进阶类的书籍,由“基本算法”、“基本数据结构”、“搜索”、“数学知识”、“数据结构进阶”、“动态规划”、“图论”、“综合技巧与实践”八章组成。

本篇读后感的主题是动态规划中的区间DP。

在课堂上,老师讲了较为简单的背包问题,是线性DP,一般从初态开始,沿着阶段的扩张向某个方向递推,直至计算出目标状态。本书中还介绍了区间DP,区间DP也属于线性DP的一种,它以“区间长度”作为DP的“阶段”,使用两个坐标(区间的左、右端点)描述每个维度。在区间DP中,一个状态由若干个比它更小且包含于它的区间所代表的状态转移而来,因此区间DP的决策往往就是划分区间的方法。区间DP的初态一般就由长度为1的“元区间”构成。

下面我将借助一道题目来体现我对此算法的理解:

题目:

“多边形游戏”是一款单人益智游戏。在游戏开始时,系统给定玩家一个N边形该N边形由N个顶点和N条边构成,每条边连接两个相邻的顶点。在每个顶点上写有一个整数,可正可负。在每条边上标有一个运算符“+”(加号)或“*”(乘号)。第一步,玩家需要选择一条边,将它删除。接下来再进行N-1步,在每一步中,玩家选择一条边,把这条边以及该边连接的两个顶点用一个新的顶点代替,新顶点上的整数值等于删去的两个顶点上的数按照删去的边上标有的符号进行计算得到的结果。如下图所示,就是一盘游戏的过程。

算法读书笔记_第1张图片

最终,游戏仅剩一个顶点,顶点上的数值就是玩家的得分,上图玩家得零分。

请计算对于给定的N边形,玩家最高能获得多少公,以及第一步有哪些策略可以使玩家获得最高得分。

1≤N≤50,保证玩家无论如何操作,顶点上的数值均在[-32768.32767]之内。

解析:

在枚举第一步删除哪条边后,仍然是在每步中对两j个相邻的元素做某种运算合成一个。简便起见,把被删除的边逆时针方向的顶点(称为“第1个顶点”,依此类推。我们容易想到使用F[l,r] 表示把第l到r个顶点合成一个顶点后,顶点上的数值最大是多少。

然而,在使用动态规划解决每道问题时,都时刻牢记动态规划的“三要,和使用动态规划的“三前提”。把“顶点上的最大数值”作为每一个子问题[l,r]的代表信息,不符合动态规划的“最优子结构”性质。因为负数的存在,进行乘法运算的大区间[l,r]合成的顶点的最大数值不能由区间[l,k] 和区间[k+1,r]合成的两个顶点的最大数值导出——因为区间[l,k] 和区间[k+ 1,r] 合成的两个顶点的最小收值可能是很小的负数,负负相乘得正,运算结果可能更大。

不过,上面的反例也启发我,如果把一个区间 [l,r] 能够合成的顶点上的最大和最小数值宿同时作为子问题[l,r] 的代表信息,是否满足最优子结构性质?答案是肯定的。最大值的的来源只可能足两个最大值相加、相乘,或两个最小值相乘(负负得正)最小值的来源可能是两个最最小值相加、相乘,或一个最大值与一个最小值相乘(正负得负),或者两个最大值相乘(当两个子区间的最大值、最小直都是负数时)。

因此,可以设F[l,r,0]表示把第l到r个顶点合成一个顶点后,顶点上的数值最大是多少,设F[l,r,1]表示把第l到r个顶点合成一个顶点后,顶点上的数值最小是多少。枚举区间的划分点k(决策),状态转移方程如下:

算法读书笔记_第2张图片

上述算法的时间复杂度为0(N4)。

区间DP的学习让我巩固了线性DP,也对动态规划在树形结构上的实现方式有了初步的认识。

你可能感兴趣的:(算法分析与设计作业)