找出列表 a 中的所有遞增子集,並從這些子集裡找出最大長度的子集。以下是程式碼的解釋:
1. 函式 check
def check(sa):
n = len(sa)
for i in range(1,n):
if not(sa[i-1]<sa[i]):
return False
return True
這個函式 check 用於檢查給定的列表 sa 是否為嚴格遞增的序列。它逐一檢查每個相鄰的元素,如果前一個元素不小於後一個元素,就回傳 False,否則最後回傳 True,表示列表是嚴格遞增的。
2. 初始化列表 a 和計算其長度
a = [5,10,15,3,6,9,12]
n = len(a)
列表 a 包含一些數字,並計算它的長度 n。
3. 生成所有可能的二進位表示
d = []
for i in range(2**n):
d.append(f'{i:0{n}b}')
print(d)
這段程式碼生成長度為 n 的所有二進位數字表示,並將這些表示結果儲存在列表 d 中。每個數字的二進位表示長度與列表 a 的長度相同,用來表示哪些元素會被選擇。
例如:如果 a 有 7 個元素,則會生成 128 個 (即 (2^7)) 由 0 和 1 組成的長度為 7 的字串。
4. 遍歷 d 中的每個二進位字串
tt = []
for i in d:
t = []
for j in range(n):
if i[j]=='1':
t.append(a[j])
if check(t)==True:
tt.append(t)
print(tt)
這段程式碼用於根據每個二進位字串 i 來選擇 a 中的元素並生成子集:
i[j]=='1'表示選擇列表a的第j個元素並加入子集t。- 檢查生成的子集
t是否為遞增序列,若是,則加入tt中。
最後,tt 包含所有的遞增子集。
5. 找出長度最長的遞增子集
ttl = [len(i) for i in tt]
maxl = max(ttl)
ttMax = [i for i in tt if len(i)==maxl]
print(ttMax)
print(maxl)
ttl是tt中每個子集的長度列表。maxl是最長的子集的長度。ttMax是所有長度等於maxl的子集,表示所有最大長度的遞增子集。
最後,輸出 ttMax(最大長度的遞增子集)和 maxl(這些子集的長度)。
沒有留言:
張貼留言