筆記——最長上升子序列
int bSearch(int num,int k)//返回可更新的位置,如 1 3 4 ,2->1 2 4 將k長度的上升子序列的尾巴更新到最小
{
int low=1,high=k;
while(low<=high)
{
int mid=(low+high)/2;
if(num>=p[mid])
low=mid+1;
else
high=mid-1;
}
return low;
}
int LIS(int n)
{
int low=1,high=n;
int k=1;
for(int i=2;i<=n;++i)
{
if(p[i]>p[k])//若p[i]>p[k],上升子序列長度加1,p[i]變成尾巴
p[++k]=p[i];
else//若不是,則更新某一長度的尾巴
{
int pos=bSearch(p[i],k);
p[pos]=p[i];
}
}
return k;
}
{
int low=1,high=k;
while(low<=high)
{
int mid=(low+high)/2;
if(num>=p[mid])
low=mid+1;
else
high=mid-1;
}
return low;
}
int LIS(int n)
{
int low=1,high=n;
int k=1;
for(int i=2;i<=n;++i)
{
if(p[i]>p[k])//若p[i]>p[k],上升子序列長度加1,p[i]變成尾巴
p[++k]=p[i];
else//若不是,則更新某一長度的尾巴
{
int pos=bSearch(p[i],k);
p[pos]=p[i];
}
}
return k;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.