http://wikioi.com/problem/1044/
但是以后每一发炮弹都不能高于前一发的高度
这句话其实是提示,第一个问题就是正向一边lis,
第二个问题其实可以发现如果之后有比前面高的必然要多一套,因此可以倒着来一遍lis
#include<cstdio>
int ans=0;
int d[30];
int b[30];
int dd[30];
int rear=0;
int cnt=20;
int so(int x)//nlogn的lis
{
int l=1,r=rear;
while(l<=r)
{
int mid=(l+r)/2;
if(b[mid]>=x)r=mid-1;
else l=mid+1;
}
if(l>rear)rear=l;
return l;
}//找到栈中第一个比x大的替换他,没有就会放在末尾
int main()
{
while(scanf("%d",&d[ans+1])==1)ans++;
for(int i=1;i<=ans;i++)
{
b[so(d[i])]=d[i];
}
int d2=rear;
rear=0;
for(int i=1;i<=ans;i++)dd[ans-i+1]=d[i];
for(int i=1;i<=ans;i++)
{
b[so(dd[i])]=dd[i];
}
int d1=rear;
printf("%d\n%d",d1,d2);
}