您的位置:首页 > 其它

最长单调递增子序列O(nlogn)

2015-11-17 14:39 190 查看
#include "iostream"
#include "fstream"
using namespace std;

/*
b[k]表示长度为i的子序列c[i]中,长度为k的最长单调递增子序列的最小结尾元素值
当c[i]>=b[k], k = k + 1; b[k] = c[i]
否则,将c[i]放置到b[]中适当位置
*/

int b[100];
int c[100];

//二分搜索法在b[1,k]中找到下标h,使得b[h-1]<=c[i]<=b[h]
int binary(int i, int k)
{
int l, h;
if(c[i] < b[1])
return 1;
for(l=1, h=k; l!=h-1;)
{
if(b[k=(l+h)/2] <= c[i])
l = k;
else
h = k;
}
return h;
}

int increase(int n)
{
int i = 1, k;
b[1] = c[1];
for(i=2, k=1; i<=n; i++)
if(c[i] >= b[k])
b[++k] = c[i];
else
b[binary(i, k)] = c[i];
return k;
}

int main()
{
int n;
cout << "输入序列长度:" ;
cin >> n;
cout << "输入子序列:";
for(int i=1; i<=n; i++)
cin >> c[i];
int count = increase(n);
cout << "最长单调递增子序列为:" << count << endl;
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: