POJ 1065 Wooden Sticks(LIS,最少链划分)
题意:求二维偏序的最少链划分。
用到Dilworth定理:最少链划分=最长反链。(对偶也成立,个人认为区别只是一个维度上的两个方向,写了个简单的证明
相关概念:偏序集,链,反链等等概念可以参考这里:http://www.cnblogs.com/fstang/archive/2013/03/31/2991220.html
Dilworth定理的证明(英文的):http://aleph.math.louisville.edu/teaching/2009FA-681/notes-091119.pdf
证明
简要来说,设链的最小划分数为p,最长反链长度为l,证明分两步:
(1).p≥l。因为反链上任意两点都不可能在同一个链中,抽屉原理可知p≥l。
(2).p≤l。反复选择反链的极小元点集Xi从全集S中删除直到S为空,
每次阶段的选择的Xi则构成一个链划分(这个可以反证,如果Xi存在a和b无法比较,那么反链中是可比的,则a和b不可能同时是反链的极小元)
最后一次删除将会对应最长的反链。所以链划分了l次,而p是最小链划分,所以有l≥p。
至于实现上,我采用的是O(nlogn)的逆向求LIS的方法来得到最长反链的。
(似乎根据证明第二步可以得出贪心做法,不过因为要排序时间复杂度还是O(nlogn)。
#include<cstdio> #include<iostream> #include<string> #include<cstring> #include<queue> #include<vector> #include<stack> #include<vector> #include<map> #include<set> #include<algorithm> //#include<bits/stdc++.h> using namespace std;const int N = 5e3+5;struct Stick {int l, w;bool operator <(const Stick &th) const{return l < th.l || (l == th.l && w < th.w);}void IN(){ scanf("%d%d",&l,&w); } }stick[N];int g[N];//#define LOCAL int main() { #ifdef LOCALfreopen("in.txt","r",stdin); #endifint T; cin>>T;while(T--){int n; scanf("%d",&n);for(int i = 0; i < n; i++){stick[i].IN();}sort(stick,stick+n);memset(g,0x3f,sizeof(int)*n);int ans = 0;for(int i = n-1; i >= 0; i--){int k = lower_bound(g+1,g+n-i,stick[i].w)-g;ans = max(ans,k);g[k] = stick[i].w;}printf("%d\n",ans);}return 0; }
转载于:https://www.cnblogs.com/jerryRey/p/4885732.html
POJ 1065 Wooden Sticks(LIS,最少链划分)相关推荐
- poj 1065 Wooden Sticks
/* 先按l排序 再每次找出一段最长的递增序列! */ #include <stdio.h> #include <stdlib.h> #include <string.h ...
- Wooden Sticks POJ - 1065(最大上升子序列+动态规划状态转移思维)
题意: 给你n个木棍的长度和重量,让其成为上升序列,如果不能达到,就需要重新一分钟设置. a)第一个木棍的准备时间为1分钟. b)在处理长度为l和重量为w的棒之后,如果l <= l'并且w &l ...
- HDU-1051 Wooden Sticks
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- 1270: Wooden Sticks [贪心]
点击打开链接 1270: Wooden Sticks [贪心] 时间限制: 1 Sec 内存限制: 128 MB 提交: 31 解决: 11 统计 题目描述 Lialosiu要制作木棍,给n根作为原料 ...
- 欧拉路径 之 poj 2513 Colored Sticks
/* 欧拉路径 之 poj 2513 Colored Sticks欧拉路径: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径.无向图存在欧拉路径 充要条件:1) 图是连通的 ...
- 判断线段相交 + vector. erase迭代指针 的使用 poj 2653 Pick-up sticks
题目来源:http://poj.org/problem?id=2653 分析: 题意:按顺序给出一些木棍,输出在最上面的木棍标号. 用vector 存储木棍标号, 当前木棍与 vector 中的木棍 ...
- 【代码超详解】ZOJ 2551 / POJ 2653 Pick-up Sticks(快速排斥实验 + 跨立实验判断线段是否相交 · 模板)
一.传送门 http://poj.org/problem?id=2653 https://zoj.pintia.cn/problem-sets/91827364500/problems/9182736 ...
- ZOJ 1025 Wooden Sticks(快排+贪心)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=25 题目大意:机器运送n个木条,每个木条有一个长度和重量.运送第一根木 ...
- hdu1051 Wooden Sticks
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1051 大意:求最少升序序列的个数. #include <cstdio> #include &l ...
最新文章
- jquery Fancybox插件的应用
- Request_继承体系
- 剑指offer之找到链表里面包含环的入口节点
- 6月20日云栖精选夜读丨国内首家!阿里云宣布全面提供IPv6服务
- 记录android离屏渲染的一些资料
- 一文详解Python中的*可变参数与**关键字参数
- 伪代码之KMeans和DBSCAN
- scan ip和vip的关系疑惑
- 深度学习框架tensorflow学习与应用——代码笔记11(未完成)
- 【PAT甲级A1003 】Emergency (25分)(c++)
- 战地系列服务器架设,战地3服务器架设数据库
- 运动耳机性价比高,运动耳机品牌排行榜
- argue的一个用法
- 【Shell】在windows下编辑shell脚本
- AjaxSubmit提交额外数据
- fms5序列号_CentOS下安装FMS5.0 互联网技术圈 互联网技术圈
- waveform波形图(时域图)、spectrum(频谱图)、spectrogram(语谱图)、MFCC
- 第4课:Scratchjr运动指令
- 电商网站购物车存储方式
- 使用obsidian数据同步至Git,从而解决obsidian多端同步收费的问题-windows
热门文章
- 地址栏引用PHP中变量,PHP 读取地址栏 参数
- php fastdfs扩展,php如何安装fastdfs扩展
- 计算机游戏攻略67,保卫萝卜2 67攻略水晶萝卜详解
- mysql query profiler_MySQL Query Profiler
- Web的新图像格式WebP
- json转java代码_Java代码:javabean和json互转
- 高一计算机会考英语,高中会考英语单词表.doc
- ubuntu18 防火墙关闭_Ubuntu防火墙怎么关闭或打开?
- client中周期性边界_化工中的流体力学问题(附多物理场视频)
- python的集合类型_python集合类型