1. 程式人生 > 其它 >小豬過河(最長上升子序列)

小豬過河(最長上升子序列)

技術標籤:程式碼python演算法

小豬過河(通訊網理論基礎)

只小豬排成一個佇列在沿河的公路上飛馳。現有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)