習題15.4-5,15.4-6:長度為n的陣列,尋找最長遞增子串行。要求(1)時間複雜度o(n^2) (2)時間複雜度o(n lg n)
解:可以利用公共子串行來解,將陣列a排序得到a',則a與a'的最大公共子串行即為所求,o(n * n)。下面的兩種方法都是直接基於動態規劃。
設輸入序列為a[1 .. n],以a[i]作為最後乙個元素的最長序列的長度為l[i],則l[i] = max
def findseq(a, l):
seq =
curpos = l.index(max(l))
for i in range(curpos-1, -1, -1):
if l[i] == l[curpos]-1:
curpos = i
seq.insert(0, a[curpos])
return seq
#o(n * n)
def longincreaseseq(a):
l = [0]*len(a)
for i in range(len(a)):
longest = 1
for j in range(i):
if a[j] < a[i] and l[j]+1 > longest:
longest = l[j]+1
l[i] = longest
print l
print findseq(a, l)
return max(l)
#o(n * lg n)
def longincreaseseq_nlgn(a):
inf = max(a)+1
#minend[i] = min
minend = [inf]*len(a)
l = [0]*len(a)
for i in range(len(a)):
j = bisect.bisect_left(minend, a[i])
minend[j] = a[i]
l[i] = j+1;
print findseq(a, l)
return max(l)
a = [random.randint(0, 20) for i in range(15)]
print a
print longincreaseseq(a)
print longincreaseseq_nlgn(a)
演算法導論 最長遞增子串行
華電北風吹 日期 2016 2 20 問題描述 例如陣列arr 1,5,8,2,3,4 的最長遞增子串行是1,2,3,4 動態規劃求解。對於陣列中的每個元素,從前往後計算每個元素的狀態 到這個元素為止所構成的最長遞增子串行。時間複雜度 n2 include include using namespa...
演算法導論15 4 6 最長單調遞增子串行
參考資料 程式設計之美 2.16 題目 給出乙個o nlogn 的演算法,使之能夠找出乙個n個數的序列中最長的單調遞增子串行。o n2 的比較好理解,沒有仔細研究,研究了下o nlogn 的解答和好多大神的分析才明白一些,發現玄妙無限呀 對於序列sn,考慮其長度為i的單調子列 1 i m 我們選取這...
動態規劃之最長遞增子串行
基本歸納法 對於ai 1,只要考察其前乙個狀態ai即可完成整個推理過程,它的特點是只要ai確定,則計算ai 1便不需要考察前序狀態a0.ai 1,我們將這一模型稱之為馬爾科夫模型 高階歸納法 相應的,對於ai 1,考察前i個狀態集才可完成整個推理過程,往往稱之為高階馬爾科夫模型 在計算機演算法中,高...