Sample Input
6
5 2 1 4 5 3
3
1 1 1
4
4 3 2 1
Sample Output
3
1
1
求最长递增子序列,可以不连续
如1395738
为13578 输出长度5
#include<cstdio>
#include<iostream>
using namespace std;
int dp[100005],s[100005];
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=0;i<n;i++)
scanf("%d",&s[i]);
int len=1;
dp[0]=s[0];
for(int i=1;i<n;i++)
{
int left=0,right,mid;
if(s[i]>dp[len-1])
dp[len++]=s[i];
else
{
right=len-1;
while(right>=left)
{
mid=(left+right)/2;
if(dp[mid]<s[i])
left=mid+1;
else
right=mid-1;
}
dp[left]=s[i];
}
}
printf("%d\n",len);
}
}
思路;dp[i]为长度为i的最长递增不连续子序列
并以dp[i]的值为结尾。
如5 2 1 4 5 3 中
dp[2]为长度为2,dp[2]=4(dp[2]为结尾)
若找到了比145还有2把dp[2]=4更新为dp[2]=2;
核心二分
while(right>=left)
{
mid=(left+right)/2;
if(dp[mid]<s[i])
left=mid+1;
else
right=mid-1;
}