程式設計之美2 16 最長上公升子串行

2021-06-01 12:01:25 字數 893 閱讀 7247

如何求乙個一維陣列(n個元素)中最長遞增子串行?

例如給定序列1-1,2,-3,4,-5,6,,-7,其中最長遞增子串行的長度為4(如1,2,4,6)。

經典解法:也是傳統解法,動態規劃,每加入乙個新的數字,則檢查是否和前面所記錄的序列能組成更長序列。示例如下:

掃瞄序列     1 -1 2 -3 4 ……

記錄序列最大值   1 -1 2  1 4 ……

記錄序列長度     1  1 2 -3 3 ……

**如下:

int lis(int array, int len)

} if(list[i] > max)

max = list[i];

} return max;

}

改進解法:傳統解法的時間複雜度o(n^2)。顯然效率不高,也是較基本的一種解法,認真分析發現其中有大量重複判斷。舉個例子:

5 6 7 1 2 3 4 8.顯然當加入8的時候,只需和1 2 3 4構成序列即可,不必記錄和5 6 7構成序列的情況,這是關鍵,因為對於未來情況也就是8後面的情況,都是一樣的,所以完全不必記錄和5 6 7構成序列的情況。如果每加入乙個數字,能夠按優先匹配歷史最長序列長度顯然能提高效率。

**如下:

int lis(int array, int len)

for(int i = 1; i < len; i++)

}//如果當前最長序列大於最長遞增序列長度,更新最長資訊

if(list[i] > nmaxlis)

else if(maxs_min_v[j] < array[i] && array[i] < maxs_min_v[j + 1])

}return nmaxlis;

}

最長遞增子串行 程式設計之美2 16

問題 給定乙個序列an a1,a2,an 找出最長的子串行使得對所有i j,ai 1.用動態規劃實現 求最長的子串行長度 int longestincreasesubserial int array,int length 初始化各個子串行的最大長度 int currentmax new int le...

最長上公升子串行

問題描述 乙個數的序列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...