lcs可有三种实现 ,
1,n*n/2 ,
2 ,dp ,,排序后,寻找最长公共序列 nlogn+n*n
3 , dp ,记录各个len所需的最小数字限额法 ,O(n*lgn)

/**//*
writen by widyrobin
windyrobin@hotmail.com
04/10/2008
*/
#include <iostream>
using namespace std;
#define MAX_INPUT_NUM 10000
int limit[MAX_INPUT_NUM];
int main()
...{
int inputNum;
int curNum;
int tempBegin;
int tempEnd;
int tempMiddle;
int len;

while(cin>>inputNum)...{
len=0;//the count
for(int i=0;i<inputNum;i++)...{
cin>>curNum;
tempEnd=len;
tempBegin=1;
tempMiddle=0;

while(tempBegin<=tempEnd)...{
tempMiddle=(tempBegin+tempEnd)>>1;
limit[tempMiddle] >=curNum ? tempEnd=tempMiddle-1 : tempBegin=tempMiddle+1;
}
limit[tempBegin]=curNum;//first position whose value >=curNum ,if no existed ,is end+1
tempBegin >len ? len++ :NULL;
}//end for ..
cout<<len<<endl;
}//end while
return 0;
}
本文介绍了一种求解最长递增子序列(LIS)问题的高效算法,通过使用二分查找来更新序列长度,实现了O(n log n)的时间复杂度。文章提供了详细的代码示例,展示了如何对输入序列进行处理以找到最长递增子序列。
&spm=1001.2101.3001.5002&articleId=2277995&d=1&t=3&u=0ec26663ff4b4dd3a880965f4cfbfc29)
638

被折叠的 条评论
为什么被折叠?



