動的計画法を使用して最長増加サブシーケンスの長さを調べるために、この実装を作成しました。[10, 22, 9, 33, 21, 50, 41, 60, 80] の入力の場合、LIS は 6 で、セットの 1 つは [10, 22, 33, 50, 60, 80] です。
以下のコードを実行すると、O(n) の複雑さで 6 という正しい答えが得られます。それが正しいか?
def lis(a):
dp_lis = []
curr_index = 0
prev_index = 0
for i in range(len(a)):
prev_index = curr_index
curr_index = i
print 'if: %d < %d and %d < %d' % (prev_index, curr_index, a[prev_index], a[curr_index])
if prev_index < curr_index and a[prev_index] < a[curr_index]:
print '\tadd ELEMENT: ', a[curr_index]
new_lis = 1 + max(dp_lis)
dp_lis.append(new_lis)
else:
print '\telse ELEMENT: ', a[curr_index]
dp_lis.append(1)
print "DP LIST: ", dp_lis
return max(dp_lis)
if __name__ == '__main__':
a = [10, 22, 9, 33, 21, 50, 41, 60, 80]
print lis(a)