导弹拦截( 二分+dilworth定理)

 

https://www.luogu.org/problemnew/show/P1020 原题

 

接下来是dilworth定理

https://blog.csdn.net/u011676717/article/details/11842809

关键就是:  如果是求下降子序列的最小划分,相当于是求最小反链划分,等于最长不下降子序列的长度。

。。求 下降子序列的最小划分  等于最长非下降子序列长度(确定

  求非上升子序列的最小划分  等于最长非下降子序列长度还是等于最长上升子序列长度? 。。。

 

 1 const int INF= 0x3f3f3f3f;
 2 
 3 int a[N];
 4 int q[N],book[N]={0};
 5 
 6 int main()
 7 {
 8     memset(q,INF,sizeof(q));
 9     int cnt=0;
10     while(cin>>a[cnt]) cnt++;
11 
12     for(int i=cnt-1;i>=0;i--)
13         *upper_bound(q,q+cnt,a[i])=a[i]; 
14     /* lower和upper的这两个函数原来要求是升序,题目要求降序, 于是就从i=cnt-1
15        开始,从后往前升序,upper是找到大于a[i]的第一个 ,因为题目的要求是非升序,存在等于的情况
16     */
17     cout<<lower_bound(q,q+cnt,INF)-q<<endl;//这里还是lower
18 
19     memset(q,INF,sizeof(q));
20     for(int i=0;i<cnt;i++)
21         *lower_bound(q,q+cnt,a[i])=a[i];  //这里用>=没毛病
22     cout<<lower_bound(q,q+cnt,INF)-q<<endl;
23 }

 

转载于:https://www.cnblogs.com/thunder-110/p/9324612.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值