8596 最長上公升子串行(優先做)

2021-10-14 17:17:16 字數 2382 閱讀 6512

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結尾的最長上公升子串行的長度,初始時...