题目大意:

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

Dliworth有两个互相对偶的定理:
U的链划分使用的最少集合数,等于它的最大反链长度。(1)
U的反链划分使用的最少集合数,等于它的最大链长度。(2)

更详细的讲解

#include <bits/stdc++.h>
using namespace std;
int a[];
int dp1[],dp2[];
int f1[],f2[];
/// 将 对应长度的最后一位的下标 存入f1[] f2[]中
/* 即若 2 2 4 3 对应下标为 0 1 2 3
则长度为 1 2 3 时
f[]对应为 f[1] f[2] f[3]
0 1 3
2 2 2 2 2 3
*/
int main()
{
int k=;
while(~scanf("%d",&a[++k])) ;
memset(f1,,sizeof(f1)); memset(f2,,sizeof(f2));
int t1=,t2=;
for(int i=;i<k;i++) {
dp1[i]=dp2[i]=;
for(int j=t1;j>;j--)
if(a[f1[j]]>=a[i]) {
dp1[i]=j+; break;
}
t1=max(t1,dp1[i]);
if(!f1[dp1[i]]) f1[dp1[i]]=i;
else if(a[f1[dp1[i]]]<a[i]) f1[dp1[i]]=i;
for(int j=t2;j>;j--)
if(a[f2[j]]<a[i]) {
dp2[i]=j+; break;
}
t2=max(t2,dp2[i]);
if(!f2[dp2[i]]) f2[dp2[i]]=i;
else if(a[f2[dp2[i]]]>a[i]) f2[dp2[i]]=i;
}
printf("%d\n%d\n",t1,t2); return ;
}

最新文章

  1. Util应用程序框架公共操作类(三):数据类型转换公共操作类(扩展篇)
  2. 适配iOS 10以及Xcode 8(转载)
  3. Andorid实现点击获取验证码倒计时效果
  4. TestLink学习六:TestLink1.9.13工作使用小结
  5. 解决 FastReport 使用存储过程 找不到临时表问题
  6. 【高级JEE技术】JMX
  7. Jenkis Editable Email Notification Plugin 使用介绍
  8. 纯css实现select下拉框并排显示
  9. Linux设备驱动故障定位指引与实例
  10. 为什么fork()2次会避免产生僵尸进程
  11. redhat开启端口
  12. 【Beta阶段】第七次Scrum Meeting!
  13. 33. 完全卸载oracle11g步骤
  14. 关于gcc、make和CMake的区别
  15. Python之路(第九篇)Python文件操作
  16. codevs 1380 没有上司的舞会 - 树形动态规划
  17. [笔记]python
  18. 浏览器报ScriptResource.axd异常
  19. The Bitizens Team
  20. 关于Amazon.com Seller 网络以及IP地址更换 官方回答

热门文章

  1. php上传(一)
  2. android高级篇收录
  3. NX二次开发-UFUN获取点在面上U,V方向的位置UF_MODL_ask_face_parm【转载】
  4. vue中使用腾讯云Im
  5. trackback 捕获异常并打印
  6. jdk linux配置
  7. 用python, PIL在图像上添加文字(可以控制,调节为水印等)
  8. USACO2008 Roads Around The Farm /// queue oj23321
  9. haproxy Mycat集2---KeepAlived
  10. windows下怎么给ubantu虚拟机全屏的处理