题目链接: 点击打开链接
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
//int num[10]= {3,6,3,2,4,6,7,5,4,3};
const int INF=0x3f3f3f3f;
int l;
int g[100010];
int d[100010];
int num[100010];
int main()
{
int a;
scanf("%d",&a);
while(a--)
{
scanf("%d",&l);
memset(num,0,sizeof(num));
for(int i=0; i<l; i++)
scanf("%d",&num[i]);
fill(g,g+l,INF);
int max_=-1;
for(int i=0; i<l; i++)
{
int j=lower_bound(g,g+l,num[i])-g;
d[i]=j+1;
// if(max_<d[i])
// max_=d[i];这里可以改成求最长上升子序列
g[j]=num[i];
}
for(int i=0; i<l-1; i++)
printf("%d ",d[i]);
printf("%d\n",d[l-1]);
// printf("%d\n",max_);
}
return 0;
}
lis算法,一个小的知识点,最长上升子序列的改良版。