P1020 导弹拦截 /// DP Dilworth定理 LIS、LDS优化
2024-09-06 08:13:44
题目大意:
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 ;
}
最新文章
- Util应用程序框架公共操作类(三):数据类型转换公共操作类(扩展篇)
- 适配iOS 10以及Xcode 8(转载)
- Andorid实现点击获取验证码倒计时效果
- TestLink学习六:TestLink1.9.13工作使用小结
- 解决 FastReport 使用存储过程 找不到临时表问题
- 【高级JEE技术】JMX
- Jenkis Editable Email Notification Plugin 使用介绍
- 纯css实现select下拉框并排显示
- Linux设备驱动故障定位指引与实例
- 为什么fork()2次会避免产生僵尸进程
- redhat开启端口
- 【Beta阶段】第七次Scrum Meeting!
- 33. 完全卸载oracle11g步骤
- 关于gcc、make和CMake的区别
- Python之路(第九篇)Python文件操作
- codevs 1380 没有上司的舞会 - 树形动态规划
- [笔记]python
- 浏览器报ScriptResource.axd异常
- The Bitizens Team
- 关于Amazon.com Seller 网络以及IP地址更换 官方回答
热门文章
- php上传(一)
- android高级篇收录
- NX二次开发-UFUN获取点在面上U,V方向的位置UF_MODL_ask_face_parm【转载】
- vue中使用腾讯云Im
- trackback 捕获异常并打印
- jdk linux配置
- 用python, PIL在图像上添加文字(可以控制,调节为水印等)
- USACO2008 Roads Around The Farm /// queue oj23321
- haproxy Mycat集2---KeepAlived
- windows下怎么给ubantu虚拟机全屏的处理