最長上公升子串行

2021-07-30 22:35:37 字數 914 閱讀 4227

給你乙個有n個元素的數列b,你需要從中找到乙個子串行a,a中元素滿足ai解題思路

對於這個問題,我們通常採取動態規劃的方式來解決,設dp[i]為以第i個元素結尾的上公升子串行的長度,dp[1]-dp[n]初始化為1,dp[0]初始化為0,當我們計算dp[i]的結果的時候,前i個結果我們以前計算得出,則我們可以根據前面計算的結果進行轉移,

dp[i] = max(dp[i],dp[j]+1)(1<=jb[j])

樸素的演算法思想如上所述,其時間複雜度為o(n2),但是我們可以對這個演算法進行優化,進一步降低它的時間複雜度。假定我們已經計算完成了前m個元素結尾的上公升子串行的度,其中dp[i]=dp[j],1<=i<=m,1<=j<=m,i != j。如果b[i] < b[j],當我們下一次遇到b[k] > b[j]時,我們即可以選擇b[i]結尾的序列,也可以選擇b[j]結尾的序列,但是由於選擇b[i]並不會影響最優解,因此我們每次都講相同長度下結尾較小的元素保留下來,這樣可以實現o(nlg(n))的時間複雜度。

#include #include #include #include using namespace std;

const int maxn = 100000+5;

const int inf = 0x3f3f3f3f;

int a[maxn];

int g[maxn];//儲存長度為n的上公升子串行的結尾元素

int main()

memset(g,inf,sizeof(g));

int ans = -inf;

for(int i = 0; i/*for(int i = 1;i<=n;i++)

*/cout << ans << endl;

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