刷題——Bridging signals POJ - 1631
/*
每條線本來都要按1-1 2-2 n-n的方式相連,現在亂了
問切除掉一部分線之後,剩下的不相交的線有多少
若有部分線相連的線的序號是遞增的那麼這部分線就是不相交的
所以就是求最大上升子序列(LIS)
*/
#include <stdio.h>
int p[40005];
int bSearch(int num,int 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[++k]=p[i];
else
{
int pos=bSearch(p[i],k);
p[pos]=p[i];
}
}
return k;
}
int main(){
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&p[i]);
}
printf("%d\n",LIS(n));
}
return 0;
}
每條線本來都要按1-1 2-2 n-n的方式相連,現在亂了
問切除掉一部分線之後,剩下的不相交的線有多少
若有部分線相連的線的序號是遞增的那麼這部分線就是不相交的
所以就是求最大上升子序列(LIS)
*/
#include <stdio.h>
int p[40005];
int bSearch(int num,int 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[++k]=p[i];
else
{
int pos=bSearch(p[i],k);
p[pos]=p[i];
}
}
return k;
}
int main(){
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&p[i]);
}
printf("%d\n",LIS(n));
}
return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.