码迷,mamicode.com
首页 > 编程语言 > 详细

UVa 1471 Defense Lines 算法分析

时间:2018-02-05 21:58:10      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:hub   log   条件   情况   tar   进一步   from   nbsp   blog   

难度:β+

用时:0 min

题目:??

代码:??

 

这是一道贪心题。

然而不是一道简单的贪心题。

 

 

题目要求在一个大区间里删掉一个区间使得与该区间左右相邻的连续递增序列之和最长。

注意左右两侧的连续递增序列是合并后当作一整个看的。

(解释不清还是看书吧)

 

这题可以用暴力,然而会 TLE。

暴力做法就是统计以 i 点结尾的最长序列长度 g(i) 和以 i 点开头的最长序列长度 f(i)(递增的)。

然后枚举 i,j,答案是 max { g(i) + f(j) }。这样会超时。

 

正解算法是在这基础上改进了一下,使时间复杂度从 n ^ 2 降到 n x lg n。

 

因此根据时间复杂度也可以推出大致算法了。

枚举右端点 j,找到左端点 i,并且 g(i) 是 j 左边所有 g 里最大的,还要保证 i 点数值比 j 点的小。

 

后一个条件很好处理,以数值为关键字在集合里排序后寻找就行了(lg n)。关键要使得找到的点的 g 值最大。

 

不难发现,如果在数值一样大的情况下,我们可以直接抛弃那些 g 值小的点。

因为我们是从左到右枚举,这些点以后是没用的。(但不代表在整个枚举过程中都没用到)

 

更进一步,如果数值大而 g 值小的,也可以丢掉。

 

那么这样一来,从左到右枚举右端点的同时,从集合里找到相应的左端点,并且在处理完后,选择性的把右端点加入到集合里。

具体实现贴在上面的链接里了。copy from lrj。

 

2018-02-05

UVa 1471 Defense Lines 算法分析

标签:hub   log   条件   情况   tar   进一步   from   nbsp   blog   

原文地址:https://www.cnblogs.com/Alrond/p/8419062.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!