時間限制:300ms 記憶體限制:1000k
提交次數:255 通過次數:118
題型:程式設計題 語言: 無限制
description
a numeric sequence ofai is ordered if a1 < a2 < ... < an.
let the subsequence of the given numeric sequence (a1, a2, ..., an) be anysequence (ai1, ai2, ..., aik), where 1 <= i1 < i
2 < ... < ik <=n.
for example, sequence (1, 7, 3, 5, 9, 4, 8) has ordered subsequences, e. g.,(1, 7), (3, 4, 8) and many others.
all longest ordered subsequences are of length 4, e. g., (1, 3, 5, 8).
your program, whengiven the numeric sequence, must find the length of its longest orderedsubsequence.
輸入格式
there are severaltest cases. every test case includes two lines.
the first line contains the length of sequence n. the second line contains theelements of sequence - n integers in the range from 0 to 10000 each,
separated by spaces. 1 <= n <= 1000
when n is 0, it indicates test to end.
輸出格式
output must contain asingle integer for every test case ---- the length of the longest orderedsubsequence of the given sequence.
輸入樣例
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的%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 當a[i]>a[j],j大於等於1且小於i,i>1;
(3)f(i) = 1 當對任意j,(j大於等於1且小於i),都有a[i]<=a[j];
例子,對於序列: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 #include #include #include int s[1005],d[1005];
int main()
d[i] = 1 > m + 1 ? 1 : m + 1;
if (d[i] > mm) mm = d[i];
}printf("%d\n",mm);
}return 0;
}
最長上公升子串行
問題描述 乙個數的序列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結尾的最長上公升子串行的長度,初始時...