最长公共上升子序列(LCIS)
生活随笔
收集整理的這篇文章主要介紹了
最长公共上升子序列(LCIS)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意:
求最長公共上升子序列
題解:
最長公共上升子序列 = 最長公共子序列(LCS)與最長上升子序列(LIS)
LCS核心代碼:
LIS核心代碼:
for(int i=1;i<=n;i++){dp[i]=1;for(int j=1;j<i;j++){if(a[j]<a[i])dp[i]=max(dp[i],dp[j]+1);}mx=max(mx,dp[i]);}最長公共上升子序列的代碼就是在最長公共子序列上找一遍最長上升子序列即可。也就是在判斷a[i] = = b[j]的前提下,再求出上升序列
f[i][j]代表所有a[1 ~ i]和b[1 ~ j]中以b[j]結(jié)尾的公共上升子序列的集合;
f[i][j]的值等于該集合的子序列中長度的最大值;
復(fù)雜度O(n3)
代碼:
我們仔細看看代碼,第三層for循環(huán)是用來求之前的,小于a[i]的最長公共上升子序列+1長度,實際上我們需要知道的只有之前的最長公共上升子序列的長度,這樣一來我們可以用一個變量val來存放 F[ i-1 ][ k ] 中的最大值,從而就可以省略第三層循環(huán)
for (int i = 1; i <= n; i ++ ){int maxv = 1;for (int j = 1; j <= n; j ++ ){f[i][j] = f[i - 1][j];if (a[i] == b[j]) f[i][j] = max(f[i][j], maxv);if (a[i] > b[j]) maxv = max(maxv, f[i - 1][j] + 1);}}我們還可以將維度縮到一維
可知f[i][j]都是由f[i-1][j]得來的
我們用f[i]表示a序列前i個元素與b序列的(LCIS)長度,t為最長LCIS的結(jié)尾元素位置,新的轉(zhuǎn)移方程:
f[i] = f[t] +1 (a[i] = b[j])
這樣就降到一維
代碼:
二維空間的代碼:
一維數(shù)組的代碼:
總結(jié)
以上是生活随笔為你收集整理的最长公共上升子序列(LCIS)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用皮筋绑耳朵可以消肿吗
- 下一篇: 1022. 宠物小精灵之收服