小豬過河(最長上升子序列)
阿新 • • 發佈:2021-02-03
小豬過河(通訊網理論基礎)
只小豬排成一個佇列在沿河的公路上飛馳。現有n個入口,第i個入口唯一對應河對岸的第j個出口。小豬佇列在經過第i個入口時可以選擇過河與否,若選擇過河,則隊首的一隻小豬去到對岸第j個出口。要求經過了n個入口後,河對岸小豬的相對順序與原佇列相同(倒序)。求最大過河小豬數。
如圖:輸入為(4,2,6,1,3,5)表示第一個入口對應第4個出口,第二個入口對應第二個入口,等等。
情況1表示,選擇了所有入口進入,導致河對岸的小豬相對順序與原佇列不同。
情況2表示,只選擇了2,5,6號入口進入,河對岸小豬的相對順序與原佇列相同,同時河對岸小豬數量最大。(在4,5,6號入口進入也是3)
輸入:第一行為正整數t,表示t個測試用例。之後t行,每行m<20000個正整數,其中第i個正整數j表示第i個入口對應第j個出口。
輸出:每個用例輸出一行,該行有一個正整數,表示最大河對岸小豬數。
樣例:
輸入:
3
4 2 6 1 3 5
1 2 3 4 5 6 7
8 7 6 5 4 3 2 1
2 8 1 5 6 4 3 8 9
輸出:
3
7
1
5
題目分析:
該問題為最長上升子序列問題。
貪心+二分的演算法。
def FindLIS(k):
l=list()
l.append(eval(k[0]))
for i in k:
flag= 0
for j in range(len(l)):
if eval(i)<= l[j]:
l[j]=eval(i)
flag=1
break
if flag==0:
l.append(eval(i))
print(len(l))
if __name__ == '__main__':
fo= open('D:/小豬過河/測試資料1.txt', 'r')
count= fo.readline()
print("測試用例數量為:{}" .format(count))
for i in range(eval(count)):
k= fo.readline().split()
FindLIS(k)