Description
给出一序列1,输出其最长非严格下降子序列长度
Input
多组输入,每组用例输入多个整数表示该序列,以一个-1结束一组用例的输入,以两个-1结束全部输入
Output
对于每组用例,输出最长非严格下降子序列长度,相邻两组输出用空行隔开
Sample Input
389
207
155
300
299
170
158
65
-1
23
34
21
-1
-1
Sample Output
Test #1:
maximum possible interceptions: 6
Test #2:
maximum possible interceptions: 2
Solution
非严格LIS,依旧是模版题~
Code
#include<stdio.h>
#define maxn 11111
#define INF 1<<29
int dp[maxn],n;//dp[i]表示以第i个元素结尾的最长上升子序列,n表示序列长度
int get_upper_bound(int x)
{
int l=0,r=n-1;
while(l<=r)
{
int mid=(l+r)>>1;
if(dp[mid]>x)
r=mid-1;
else
l=mid+1;
}
return l;
}
int LIS(int a[])//求序列a的(非严格)最长上升子序列
{
for(int i=1;i<n;i++)
dp[i]=INF;
dp[0]=a[0];
int len=1;
for(int i=1;i<n;i++)
{
//求非严格最长上升子序列
if(a[i]>=dp[len-1])
dp[len++]=a[i];
else
dp[get_upper_bound(a[i])]=a[i];
}
return len;
}
int a[maxn],b[maxn];
int main()
{
int test=1;
while(scanf("%d",&a[0]),~a[0])
{
int res=1;
while(~a[res-1])
scanf("%d",&a[res++]);
n=res-1;
for(int i=0;i<res;i++)
b[n-1-i]=a[i];
int ans=LIS(b);
if(test!=1)printf("\n");
printf("Test #%d:\n",test++);
printf(" maximum possible interceptions: %d\n",ans);
}
return 0;
}