8596 最長上公升子串行(優先做)
時間限制:300ms **長度限制:10kb
提交次數:255 通過次數:118
題型: 程式設計題 語言: g++;gcc;vc
description
當元素 ai1 < ai2 < … < aik. 就說這個序列是有序上公升的。
給定序列(a1, a2, …, an),存在許多這樣的子串行(ai1, ai2, …, aik),
其中1 <= i1 < i2 < … < ik <= n.
也就是說,子串行是原序列允許挑選若干不連續的元素形成的序列。
舉個例子,序列 (1, 7, 3, 5, 9, 4, 8) 就有許多個上上子串行,比如(1, 7), (3, 4, 8) 等。
所有這些上公升子串行中最長的長度為4,比如 (1, 3, 5, 8).
你來程式設計實現,當給定乙個初始序列,尋找這個序列的最長上公升子串行。
輸入格式
此例包含多個測試cases(少於100組test cases)。
每一組test case包含2行。
第一行是這組case的序列長度 n。(n的範圍0~10000)
第二行包含 n個整數的乙個序列,用空格間隔這n個整數, 1 <= n <= 10000。
當n為0時,表示測試結束。
輸出格式
輸出必須對每個test case,都有乙個整數結果,表示這組case的最長上公升子串行的長度。
輸入樣例
71 7 3 5 9 4 8
61 8 3 6 5 9
51 2 3 4 5
0輸出樣例44
5提示一,對輸入字串的處理
注意:這道題和其他題的輸入輸出不同,這題是接收多組資料而非單組,以0來判別結束。
大家在接受資料的時候,不要用(c=getchar())!=』\n』諸如此類乙個字元乙個字元接受,
然後判斷是否是回車符號來結束一行的輸入,這樣的方式在你本機執行不會有問題,
但oj系統中會有錯誤,無法輸出結果,因為測試平台行末並非』\n』字元。
這裡接受資料用scanf的%d或%s,或cin等,會自動判別結束字元的,你就不要在你程式
裡專門去判別或吸收回車字元。
對於最後一組資料輸入為0表示結束,只要判斷接受的第乙個字元是否為0且字串長度
為1就結束,無須去處理回車字元。
輸入的序列可以用整型陣列或字串陣列儲存。
二,演算法的動態規劃思想
考慮採用動態規劃演算法,針對每個元素,以該元素結尾的最長有序子串行作為子問題,
計算出每個子問題的最大長度用「表」記錄下來。先寫出遞推關係式再程式設計實現。
設f(i)表示:從左向右掃瞄過來直到以a[i]元素結尾的序列,可獲得的最長上公升
子串行的長度,且最長上公升子串行包含a[i]元素(1<=i<=n)。
(這裡大家思考一下,為何要這樣假設子問題和子問題最優解f(i)?
有同學問:為何最長上公升子串行要包含a[i]元素(1<=i<=n)?
因為你所設的子問題要和更下一級子問題關聯起來。如果長度為i序列的最長上公升
子串行中沒有規定包含a[i]元素,那如何和其字首的最長上公升子串行問題關聯起來
呢?因為你沒法確認你字首的最長上公升子串行最後乙個字元在**?上公升子串行的
邊界在哪不知道的話,很難和更小規模的子問題聯絡起來,顯然是比較麻煩的。)
f(i)是從f(1),f(2), ……到f(i-1)中找最大的乙個值,再加1,或者就是1。
這主要得看a[i]這個元素能否加入到之前已經獲得的最長上公升子串行當中去,
如果能加入,是之前已獲得的最長上公升子串行長度加1;
如果不能加入,就開始乙個新的上公升子串行,長度為1。
最後,所要求的整個序列的最長上公升子串行長度為 max
f(i)的遞推公式如下:
(1)f(i) = 1 當i=1;
(2)f(i) = max 當i>1, 對某個前面的j(1<=j1, 對任意j(1<=j=a[i]
例子,對於序列:4 2 6 3 1 5 2
i = 1 2 3 4 5 6 7
a[i] = 4 2 6 3 1 5 2
f(i) = 1 1 2 2 1 3 2
這裡max=3為原問題所求的最長上公升子串行的長度。
效率分析:
f(i)的計算不超過o(n),因此,整個演算法為o(n^2)。
#include
using
namespace std;
intmain()
for(
int i=
1;i}int maxt=-1
;for
(int i=
0;i(n!=
0)cout<}while
(n!=0)
;return0;
}
最長上公升子串行
問題描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...
最長上公升子串行
最長上公升子串行問題是各類資訊學競賽中的常見題型,也常常用來做介紹動態規劃演算法的引例,筆者接下來將會對poj上出現過的這類題目做乙個總結,並介紹解決lis問題的兩個常用 演算法 n 2 和 nlogn 問題描述 給出乙個序列a1,a2,a3,a4,a5,a6,a7.an,求它的乙個子串行 設為s1...
最長上公升子串行
最長上公升子串行問題 給出乙個由n個數組成的序列x 1.n 找出它的最長單調上公升子串行。即求最大的m和a1,a2 am,使得a1動態規劃求解思路分析 o n 2 經典的o n 2 的動態規劃演算法,設a i 表示序列中的第i個數,f i 表示從1到i這一段中以i結尾的最長上公升子串行的長度,初始時...