概述
最长递增(非严格)
#include <iostream>
#define SIZE 1001
using namespace std;
int main()
{
int a[1001];
int f[1000];
int lis[1000];
int i, j, n, top, temp;
int stack[SIZE];
cin >> n;
top = 0;
/* 第一个元素可能为0 */
stack[0] = -1;
for (i = 0; i < n; i++)
{
cin >> a[i];
temp=a[i];
/* 比栈顶元素大或相等就入栈 */
if (temp >= stack[top])
{
stack[++top] = temp;
f[i]=top;
}
else
{
int low = 1, high = top;
int mid;
/* 二分检索栈中比temp大或相等的第一个数 */
while(low <= high)
{
mid = (low + high) / 2;
if (temp >= stack[mid])
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
/* 用temp替换 */
stack[low] = temp;
f[i]=low;
}
}
/* 最长序列数就是栈的大小 */
cout << top << endl;
int t=top;
for(int i=n;i>=0;i--)
{
if(f[i]==t)
{
lis[--t]=a[i];
}
if(t<0)
break;
}
for(int i=0;i<top;i++)
cout<<lis[i]<<endl;
}
}
最长递减(非严格)
#include <iostream>
#define SIZE 1001
using namespace std;
const int INF=2e9;
int main()
{
int a[1001];
int f[1000];
int lis[1000];
int i, j, n, top, temp;
int stack[SIZE];
cin >> n;
top = 0;
/* 第一个元素可能为0 */
stack[0] = INF;
for (i = 0; i < n; i++)
{
cin >> a[i];
temp=a[i];
/* 比栈顶元素小或相等就入栈 */
if (temp <= stack[top])
{
stack[++top] = temp;
f[i]=top;
}
else
{
int low = 1, high = top;
int mid;
/* 二分检索栈中比temp小或相等的第一个数 */
while(low <= high)
{
mid = (low + high) / 2;
if (temp >= stack[mid])
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
/* 用temp替换 */
stack[low] = temp;
f[i]=low;
}
}
/* 最长序列数就是栈的大小 */
cout << top << endl;
int t=top;
for(int i=n;i>=0;i--)
{
if(f[i]==t)
{
lis[--t]=a[i];
}
if(t<0)
break;
}
for(int i=0;i<top;i++)
cout<<lis[i]<<endl;
return 0;
}
最长递增(严格)
#include <iostream>
#define SIZE 1001
using namespace std;
int main()
{
int a[1001];
int f[1000];
int lis[1000];
int i, j, n, top, temp;
int stack[SIZE];
cin >> n;
top = 0;
/* 第一个元素可能为0 */
stack[0] = -1;
for (i = 0; i < n; i++)
{
cin >> a[i];
temp=a[i];
/* 比栈顶元素大数就入栈 */
if (temp > stack[top])
{
stack[++top] = temp;
f[i]=top;
}
else
{
int low = 1, high = top;
int mid;
/* 二分检索栈中比temp大的第一个数 */
while(low <= high)
{
mid = (low + high) / 2;
if (temp > stack[mid])
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
/* 用temp替换 */
stack[low] = temp;
f[i]=low;
}
}
/* 最长序列数就是栈的大小 */
cout << top << endl;
int t=top;
for(int i=n;i>=0;i--)
{
if(f[i]==t)
{
lis[--t]=a[i];
}
if(t<0)
break;
}
for(int i=0;i<top;i++)
cout<<lis[i]<<endl;
return 0;
}
最长递减(严格)
#include <iostream>
#define SIZE 1001
using namespace std;
const int INF=2e9;
int main()
{
int a[1001];
int f[1000];
int lis[1000];
int i, j, n, top, temp;
int stack[SIZE];
cin >> n;
top = 0;
/* 第一个元素可能为0 */
stack[0] = INF;
for (i = 0; i < n; i++)
{
cin >> a[i];
temp=a[i];
/* 比栈顶元素小就入栈 */
if (temp < stack[top])
{
stack[++top] = temp;
f[i]=top;
}
else
{
int low = 1, high = top;
int mid;
/* 二分检索栈中比temp小的第一个数 */
while(low <= high)
{
mid = (low + high) / 2;
if (temp > stack[mid])
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
/* 用temp替换 */
stack[low] = temp;
f[i]=low;
}
}
/* 最长序列数就是栈的大小 */
cout << top << endl;
int t=top;
for(int i=n;i>=0;i--)
{
if(f[i]==t)
{
lis[--t]=a[i];
}
if(t<0)
break;
}
for(int i=0;i<top;i++)
cout<<lis[i]<<endl;
return 0;
}
最后
以上就是安详发夹为你收集整理的(LIS)最长递增/递减子序列(带路径)模板 O(NlogN)的全部内容,希望文章能够帮你解决(LIS)最长递增/递减子序列(带路径)模板 O(NlogN)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复