nlogn的最长上升子序列(pascal语言).docVIP

  • 5
  • 0
  • 约2.11千字
  • 约 2页
  • 2017-06-12 发布于北京
  • 举报
B. 最长不下降子序列的O(n*logn)算法分析如下: 设 A[t]表示序列中的第t个数,F[t]表示从1到t这一段中以t结尾的最长上升子序列的长度,初始时设F [t] = 0(t = 1, 2, ..., len(A))。则有动态规划方程:F[t] = max{1, F[j] + 1} (j = 1, 2, ..., t - 1, 且A[j] A[t])。 现在,我们仔细考虑计算F[t]时的情况。假设有两个元素A[x]和A[y],满足 (1)x y t (2)A[x] A[y] A[t] (3)F[x] = F[y] 此时,选择F[x]和选择F[y]都可以得到同样的F[t]值,那么,在最长上升子序列的这个位置中,应该选择A[x]还是应该选择A[y]呢? 很明显,选择A[x]比选择A[y]要好。因为由于条件(2),在A[x+1] ... A[t-1]这一段中,如果存在A[z],A[x] A[z] a[y],则与选择A[y]相比,将会得到更长的上升子序列。 再根据条件(3),我们会得到一个启示:根据F[]的值进行分类。对于F[]的每一个取值k,我们只需要保留满足F[t] = k的所有A[t]中的最小值。设D[k]记录这个值,即D[k] = min{A[t]} (F[t] = k)。 注意到D[]的两个特点: (1) D[k]的值是在整个计算过程中是单

文档评论(0)

1亿VIP精品文档

相关文档