最長上公升子串行

2021-09-10 07:54:13 字數 1118 閱讀 8508

problem description

乙個數的序列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)等等。這些子串行中最長的長度是4,比如子串行(1, 3, 5, 8)。

你的任務,就是對於給定的序列,求出最長上公升子串行的長度。

input

輸入的第一行是序列的長度n (1 <= n <= 1000)。第二行給出序列中的n個整數,這些整數的取值範圍都在0到10000。

output

最長上公升子串行的長度。

sample input

71 7 3 5 9 4 8

sample output4。

我們可以用動態規劃來處理這個問題。

#include#includeusing namespace std;

int main()

maxx=max(maxx,b[i]);

} printf("%d",maxx);

}

1 7 3 5 9 4 8

我們可以直接看出來 最長的遞增子數列 1 3 5 8或者1 3 4 8

但是我們用**實現就是不一樣了。

首先呢 我們應該考慮我們需要什麼,如何來解決這個題目

最長 那我們考慮到得到是比較,而遞增 我們想到的也是比較。所我們就從第二個數開始一次與它前邊的比較。我們先建立乙個陣列來標記它 然後令陣列都為1。然後依次開始比較。7大於1則7的標記更新為1+1,3大於1更新為1+1.但是小於7。所以3這裡更新為2。這樣一次比較 如果這個數字大於前乙個數字 它就更新為上乙個數的標記加上1/從而夠成更大子數列。但是會出問題。比如假設這個數列是個 1 7 3 4 2 5這裡 5大於2 如果這裡5取2的標記值加1的話 就會導致結果錯誤了。所以我們應該每次取值的時候比較 是否比原來的子數列多。也就是**中的注釋的地方。

最後我們只輸出最大的標記數就完成了。

這個題目還可以用其他方法來處理。繼續學習

最長上公升子串行

問題描述 乙個數的序列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結尾的最長上公升子串行的長度,初始時...