最長上公升子串行(實驗回顧)

2022-07-11 04:12:08 字數 2000 閱讀 9370

今天的演算法實驗課是關於最長上公升子串行的,總結一下。

首先需要知道,子串和子串行的概念,我們以字元子串和字元子串行為例,更為形象,也能順帶著理解字元的子串和子串行:

字元子串指的是字串中連續的n個字元,如abcdefg中,ab,cde,fg等都屬於它的字串。

字元子串行指的是字串中不一定連續但先後順序一致的n個字元,即可以去掉字串中的部分字元,但不可改變其前後順序。如abcdefg中,acdg,bdf屬於它的子串行,而bac,dbfg則不是,因為它們與字串的字元順序不一致。

知道了這個,數值的子串行就很好明白了,即用數組成的子串行。這樣的話,最長上公升子串行也很容易明白了,歸根結底還是子串行,然後子串行中,按照上公升順序排列的最長的就是我們最長上公升子串行了。

最長上公升子串行(longest increasing subsequence),簡稱lis,也有些情況求的是最長非降序子串行,二者區別就是序列中是否可以有相等的數。假設我們有乙個序列bi,當b1 < b2 < … < bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列(a1, a2, …, an),我們也可以從中得到一些上公升的子串行(ai1, ai2, …, aik),這裡1<=i1還有乙個非常重要的問題:請大家用集合的觀點來理解這些概念,子串行、公共子串行以及最長公共子串行都不唯一,但很顯然,對於固定的陣列,雖然lis序列不一定唯一,但lis的長度是唯一的。再拿我們剛剛舉的栗子來講,給出序列 ( 1, 7, 3, 5, 9, 4, 8),易得最長上公升子串行長度為4,這是確定的,但序列可以為 ( 1, 3, 5, 8 ), 也可以為 ( 1, 3, 5, 9 )。

輸入: 2 3 6 1 7 4 10 8 9

設maxlength[i]儲存以第i個元素結束的子問題最長上公升子串行的長度

子問題(陣列的每一位遍歷)

maxlength 元素值

子問題:2

maxlength[1]=1 初值

子問題:2 3

maxlength[2]= maxlength[1]+1

子問題:2 3 6

maxlength[3]= maxlength[2]+1

子問題:2 3 61

maxlength[4]= 1

子問題:2 3 6 1 7

maxlength[5]= maxlength[3]+1

子問題:2 3 6 1 7 4

maxlength[6]= maxlength[2]+1

子問題:2 3 6 1 7 4 10

maxlength[7]= maxlength[5]+1

子問題:2 3 6 1 7 4 10 8

maxlength[8]= maxlength[5]+1

子問題:2 3 6 1 7 4 10 8 9

maxlength[9]= maxlength[8]+1

#include using namespace std;

void lislength(int a, int n)

// 當遍歷元素小於前面所有的元素時,設定到該遍歷元素的最長子序列長度 為 1

else if(max_t == 0 && j == i -1)

}// 更新最長子序列長度值

if (*(maxlength + i) > max)

max = *(maxlength + i);

} cout << "最長子序列長度:" << max << endl;

delete maxlength; // 銷毀動態陣列

}int main()

lislength(arr, n);

delete arr; // 銷毀動態陣列

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