/*此题题意为任意输入一段数字串,请你将最长上升子序列找出来,并且将每一个数字对应的上升子序列的编号输出出来,且输出的按照字典序排列*/
/*此题的思想为简单dp,且不断将当前下标更新为最小的也就是满足字典序输出*/
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAX=1e5+10;
const int INF=0x3f3f3f3f;
int n;
int dp[MAX];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
fill(dp,dp+n,INF);
int a,len;
for(int i=0;i<n;i++)
{
scanf("%d",&a);
len=lower_bound(dp,dp+n,a)-dp;//这里用到了二分搜索先找到当前要插入的位置
dp[len]=a; // 把数插入数组并且这里不断将当前长度的值更新为最小的即字典序
printf(i==0?"%d":" %d",len+1);//这里是对长度为1和输出格式的控制输出
}
puts("");//这里是换行与c++的endl所起到的作用相同
}
return 0;
}
hdu5748
最新推荐文章于 2017-08-10 17:27:05 发布