这里写代码片
本质:::::::::::::::::::::求最长上升子序列;;;,算法时间复杂度为O(nlogn)
#include<stdio.h>
int main()
{
int i,t,n,d[40006],s[40006],ans,m;//d记录最长递增序列;但不一定是所对应的应有的递增序列
scanf("%d",&t);
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
{
scanf("%d",&s[i]);
d[i]=0;
}
ans=0;
for(i=0;i<n;i++)
{
if(s[i]>d[ans])//ans++
d[++ans]=s[i];
else//这s[i]不影响ans,但需要改变d里的序列,为以后做准备,,你可以试试求一下1 2 3 8 9 7 8 9,之后你就知道为什么改序列了;;;
{
int l=1,r=ans;
while(l<=r)
{
m=(l+r)>>2;//位运算可进一步优化
if(d[m]==s[i]){l=m;break;}//这一步,进一步优化;;;我自己觉得是这样
if(d[m]<s[i])l=m+1;
else r=m-1;
}
d[l]=s[i];
}
}
printf("%d\n",ans);
}
return 0;
}
Bridging signals 最长上升序列+动态规划+二分
最新推荐文章于 2024-03-08 17:43:59 发布