poj 1631 Bridging signals

//最长严格上升子序列
#include<iostream> //时间复杂度为O(nlogn)
#include<algorithm>
#include
<vector>
using namespace std;
int main()
{
int n,p,a;
cin
>>n;
while(n--)
{
cin
>>p>>a;
vector
<int> col;
col.push_back(a);
for(int i=1;i<p;++i)
{
cin
>>a;
if(a>col[col.size()-1])
col.push_back(a);
else
{
int begin=0,end=col.size()-1,mid;
while(end>begin)
{
mid
=(begin+end)/2;
if(col[mid]<a) //在这道题中,事实上也并不存在col[mid]==a的情况
begin=mid+1;
else //当二者相等时执行end=mid;
end=mid;
}
col[end]
=a;
}
}
cout
<<col.size()<<endl;
}
return 0;
}

时间复杂度为O(n^2) TLE
#include<iostream>        //时间复杂度为O(n^2) TLE
#include<algorithm>
using namespace std;
int ans[40005],dp[40005];
int main()
{
/*freopen("G:\\c++.txt", "r", stdin ) ;*/
int n,p;
cin
>>n;
while(n--)
{
cin
>>p;
for(int i=0;i<p;++i)
cin
>>ans[i];
for(int i=0;i<p;++i)
{
dp[i]
=1;
for(int j=0;j<i;++j)
if(ans[j]<ans[i])
dp[i]
=max(dp[i],dp[j]+1);
}
cout
<<*max_element(dp,dp+p)<<endl;
}
return 0;
}

  

  

posted on 2011-07-22 20:05  sysu_mjc  阅读(128)  评论(0编辑  收藏  举报

导航