日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

最长递增子序列问题合集

發布時間:2025/3/19 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最长递增子序列问题合集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最長遞增子序列問題

  • 合并LIS(JLIS)
  • 第k個最大遞增子序列(KLIS)

對于求單個序列的最長遞增子序列網上的太多就不多寫了,以下是它的一些進階算法

合并LIS(JLIS)

題意
兩個整數序列A和B各自得到長度為0以上的遞增子序列后,合并成升序的序列,那么,暫且把這種序列稱為合并遞增子序列。這些序列中長度最長的序列就是合并最長遞增子序列。(JLIS. Joined Longest Increasing Subsequence)。例如,“13479”是“149”和“347”的合并LIS,因為合并“19”和“347”就能得到“13479”。

代碼:

const long long NEGINF = -9876543210 int n,m,A[100],B[100]; int catce[101][101];int jlis(int indexA,int indexB){//記憶化搜索int &ret = cache[indexA+1][indexB+1];if(ret != -1)return ret;//A[indexA]、B[indexB] 已存在,所以至少有兩個元素ret = 2; // 因為這兩個一定有大小之分long long a = (indexA == -1? NEGINF: A[indexA]);long long b = (indexB == -1? NEGINF : B[indexB]);long long maxElement = max(a,b); //選最大的再進行增長//找出下一個元素for(int nextA = indexA+1;nextA<n;++nextA)if(maxElement < A[nextA])ret = max(ret,jlis(nextA,indexB)+1);for(int nextB = indexB+1;indexB<m;++nextB)if(maxElement<B[nextB])ret = max(ret,jlis(indexA,nextB)+1);return ret; }

第k個最大遞增子序列(KLIS)

題目
某個整數序列中,去掉0個以上的數字后,剩余的部分就是原序列的子序列。例如,{7,4,9}、{10,4}、{10,9}等是{10,7,4,9}的子序列。而序列{10, 4, 7}具有不同于原序列的排列順序,因而不屬于{10,7,4,9}的子序列。嚴格遞增的子序列稱為遞增子序列。序列的遞增子序列中,最長的序列稱為最大遞增子序列(LIS)。例如:{5,20,21,22,8,9,10}的最大遞增子序列是{5,8,9,10}。(不唯一)
給出以不同數字組成(無重復數字)的序列時,請編寫程序,計算此序列的LIS中按照字典序排在第k個位置的LIS。
輸入
第一行輸入測試用例的個數C(C<=50)。各測試用例的第一行輸入序列中元素的個數n(1<=n<=500)和k(1<=k<=2*109)。第二行輸入序列的n個元素。各元素是大于等于1而小于等于100,000的整數,且同一數字只出現1次。
可以假設序列的LIS至少有k個。
輸出
每個測試用例在第一行輸出LIS的長度l,第二行以l個整數輸出第k個LIS。
示例輸入:
3
8 6
5 1 6 4 3 2 8 7
8 4
2 1 4 3 6 5 8 7
8 2
5 6 7 8 1 2 3 4

示例輸出:
3
1 4 8
4
1 3 6 8
4
5 6 7 8

總結

以上是生活随笔為你收集整理的最长递增子序列问题合集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。