(经典)POJ-1631 LIS,偏序问题
2016-05-16 23:26
405 查看
题目大意:给出N条线,求去掉最少的线使最终没有线相交。
题目链接:点击打开链接
分析:此题和POJ-1065有异曲同工之妙。
这里为了方便讲解,将一条直线用2个数字a[i],b[i]来表示,如1-4代表从1连到4的直线。
首先很容易得出2条线不想交的条件是a[i]>a[j]且b[i]>b[j](或者相反),不妨将所有直线按a来排序(实际上在输入数据时便是排好了序的),然后要求去掉最少的线使最终没有线相交,可以转化为求最终最多可以留下的不相交直线数目,即选出最多的b[i]>b[j],这样的话答案就很明显了,当然是求最长上升子序列长度啦。
至于LIS的方法这里不再累述了,可以看看POJ-1065的分析:点击打开链接
附上代码:
题目链接:点击打开链接
分析:此题和POJ-1065有异曲同工之妙。
这里为了方便讲解,将一条直线用2个数字a[i],b[i]来表示,如1-4代表从1连到4的直线。
首先很容易得出2条线不想交的条件是a[i]>a[j]且b[i]>b[j](或者相反),不妨将所有直线按a来排序(实际上在输入数据时便是排好了序的),然后要求去掉最少的线使最终没有线相交,可以转化为求最终最多可以留下的不相交直线数目,即选出最多的b[i]>b[j],这样的话答案就很明显了,当然是求最长上升子序列长度啦。
至于LIS的方法这里不再累述了,可以看看POJ-1065的分析:点击打开链接
附上代码:
#include<iostream> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f int T, n; int dp[40005]; int a[40005]; int main() { scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); memset(dp, INF, sizeof dp); for (int i = 1; i <= n; i++) *lower_bound(dp, dp + n, a[i]) = a[i]; printf("%d\n", lower_bound(dp, dp + n, INF) - dp); } return 0; }
相关文章推荐
- Java程序员的日常 —— 《编程思想》包和访问权限
- Sublime Text3安装SublimeREPL插件以及快捷键设置
- Mac下配置远程Linux 服务器SSH密钥认证自动登录
- 2016"百度之星" - 资格赛(Astar Round1)
- 不让Win7休眠的设置
- 练手项目
- Web开发基础
- Add Two Numbers
- vue项目架构
- Search Insert Position
- 旋转菜单之优酷视频
- 开源库地址
- HDU 4635 Strongly connected 强连通分量
- 3月23日作业
- 03-树3 Tree Traversals Again
- 微信开发 网页应用 本地测试环境的搭建(多图)
- Failed to deploy virtual device -- Genymotion安装虚拟器失败
- 关于两个变量值互换问题
- Oculus开发笔记(一)
- 3月26日作业