导弹拦截问题变种

问题:

求原序列最少能够分成多少个单调下降子序列。

对于这个问题其实并非是动态规划的问题,而是一个贪心的问题。贪心策略:令ans=0,a为空,逐个考虑序列中的元素x,在a中寻找大于x的最小元素,若找到,将其替换为x,循环;否则,将x添加到a中,ans+=1,循环。

下面简单证明这样做的正确性:

至于一些显然的事实,为什么不把x贴在更大的数后面,显然可以发现你这样做不会得到更优的结果,因为可以逐个尝试,每一种尝试对应一个新的a集合,其中只有一个元素不同,就是你选择贴在他后面的那个,那当然是这个不同的元素越大越好了吧,所以要满足这个条件只能贴最小的那个了(当然得大于x)。至于上图中万一a[j]>a[i],那图中争议的选法显然是错误的,因为把本可以连在一起的下降序列给分开了。

贪心是玄学,不要苛求证明的完美,有个大概正确的就已经很好了。

猜你喜欢

转载自blog.csdn.net/dengping_ss/article/details/82927213